Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
tolikrog писал(а):
Есть обычный текстовый файл, и в этом файле в конце стоит пустая строчка, без всяких символов, надо эту строчку пустую убрать...
Может стоять не только \n, но и \r, но чаще "\n\r". Легче просто скопировать файл в новый, без последних ненужных символов (которых может быть несколько)...
tolikrog это не пробел это \0 и будет, посмотри в hex редакторе, а то что в С он используется для обозначения конеца строки вообще к делу не относится...
можно сделать так:
открываешь файл в текстовом режиме на чтение и запись "r+" потом идешь с конца long pos = -1; fseek(f, pos, SEEK_END); читаешь символ fgetc если он равен '\r' или '\n' и не конец файла, то мотаешь дальше (--pos), как только встретился другой символ, перезаписываешь его fputc и выходишь.
да... обычными потоковыми функциями файл не усекается...
можно это сделать через POSIX функции. В итоге, открываем файл для чтения в бинарном режиме (чтобы не заморачиваться с трансляцией \r\n в \n), находим позицию когда заканчиваются пустые строки и усекаем файл:
Код:
#include <fcntl.h> #include <io.h>
...
FILE *instream = fopen(currentfilein, "rb");
if(!instream) { fprintf(stderr, "Problem with rr %s...", currentfilein); exit(1); }
fseek(instream, 0, SEEK_END); long file_size = ftell(instream);
if(file_size) { long pos = -1; fseek(instream, pos, SEEK_END);
Огромное спасибо, теперь все работает как надо! Только писалось, что функция _chsize неизвестна(да и в хелпе ее нету), прописал просто chsize - заработало.
Member
Статус: Не в сети Регистрация: 10.01.2010 Откуда: от Верблюда
в инсте чет начали прогу делать для расчета надежности определенной схемы.... вобщем принцип - в консольном окошке должны выводиться столбцы со значениями..... вот никак немогу доделать( там нужно чтоб в последнем нижнем столбце начиналось обязательно с 1....и чем ниже тем меньше значение...(вероятность: 0 или 1) я канеш думаю врядли найдутся добровольцы но если да то от меня ОГРОМНЕЙШАЯ благодарность вот ссылка на скачку архива...в нем собсно папка с прогой...мои попытки упрощения схемы и текст с заданием и примером разбора....и текст с моим вариантом (7) отдельно)
Задание - найти жесткие ссылки на определенный файл (Ubuntu/gcc). Как найти их количество я знаю, как найти эти самые ссылки из консоли - тоже не проблема (find), но на С пока ничего подходящего найти не могу. Не писать же вручную компаратор файлов с одинаковыми аттрибутами...
MarozOFF честно говоря, я почти ничего не понял. Проект собрался с небольшим исправлением, P уменьшалась с 1 до 0.552. Или это был пример?
в stat возвращаемые поля st_ino и st_dev однозначно определяют файл, поэтому все жесткие ссылки конкретного файла будут иметь одни и те же номера inode и устройства.
сделай stat на файл, запомни device, inode и количество ссылок. дальше откусывай от пути по 1 директории, пока не сменится device, как только сменился - делаешь шаг назад. оттуда запускаешь рекурсивно readdir, на каждую запись делаешь stat и проверяешь для файлов inode, а для директорий - device, чтоб не уйти в другую файловую систему. на каждый найденный файл с таким же inode инкрементируй счётчик, в конце он должен совпать со значением nlinks. как вариант - можно прекращать работу как только найдёшь nlinks файлов с одинаковым inode/
Member
Статус: Не в сети Регистрация: 08.05.2006 Откуда: СПБ
такая проблема. нужно глобально перехватить нажатие определенных клавиш. То есть например, в данный момент работает функция ввода( cin )то при нажатии к примеру F1 он должен переключаться на другое действие. пробовал на ассемблере это делать,но с винда 7 не дружит,или компилятор копилятор gcc ,с оболочкой mingw
_________________ Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс
Member
Статус: Не в сети Регистрация: 15.02.2009 Откуда: Лангепас
Russian писал(а):
такая проблема. нужно глобально перехватить нажатие определенных клавиш. То есть например, в данный момент работает функция ввода( cin )то при нажатии к примеру F1 он должен переключаться на другое действие. пробовал на ассемблере это делать,но с винда 7 не дружит,или компилятор копилятор gcc ,с оболочкой mingw
понятие "глобально" - растяжимое...[b] в какой ОС?[/b], какие клавиши... - вопросов много, а ответ (универсальный): пиши драйвер под каждую ось. С - язык великий и могучий (как русский) - перехват нажатия клавы и на нём писал, (без единой ASM вставки, ещё на TC 2.0 - если кто помнит), но только под DOS/ под Win32, Linux - только драйвер...
у gcc другой синтаксис asm, но это в любом случае изврат... тем более это поди попытка использовать DOS/BIOS функции int 21 и т.п.?
чтобы перехватывать WM_HOTKEY нужно использовать winAPI: создать окно, зарегистрировать хоткей и написать обработку этого сообщения. Но я так понял программа консольная (раз речь о вводе через cin) значит это тоже плохой вариант.
можно использовать getch(), которая ждет нажатия клавиши, при этом можно обрабатывать и спец.клавиши типа F1. Если первый вызов getch() вернет 0, то это означает, что нажата спец. клавиша, чтобы получить ее код нужно вызвать повторно эту же функцию getch().
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения