2015-04-07 2 views
0

При записи в файл я генерирую несколько нулевых символов/00 каждый раз, когда выполняется новая операция записи. Ниже приведен мой подход к решению этой задачи, но он не работает.Удаление нулевого символа из файла

Содержание файла:

Foo \ 00 \ 00 \ 00 \ 00 \ 00 \ 00

код подход:

int aux; 
while((aux = fgetc(fp)) != EOF){ 
    printf("%i\n", aux); 
    if(fgetc(fp) == '\00'){ 
     fseek(fp, -1, SEEK_SET); 
     ftruncate(fileno(fp), ftell(fp)); 
    } 
} 

Как это должно быть сделано?

ответ

0

2-й параметр, равный fseek(), - это позиция для поиска, относительная или абсолютная, на основе третьего параметра. Значение SEEK_SET говорит, что вы ищете абсолютную позицию -1, которая, как я подозреваю, с ошибкой. Вероятно, вы использовали SEEK_CUR, что сделало второй параметр смещением от текущей позиции. Проверка соответствия fseek() была бы уместной.

Сказанное, я бы вместо этого сохранил свой собственный счет, когда я повторил этот файл и обрезал его на основе этого количества, удалив необходимость в fseek() и ftell(). (Ну, это предполагает, что я не мог просто исключить запись NULL в первую очередь - это был бы правильный курс, если это было возможно).

+0

Проблема в том, что файл довольно длинный, и вставки выполняются постоянно. Поэтому, если он должен перебирать весь файл каждый раз при вставке новой вставки, он потеряет много времени. – qwerty

+0

Можете ли вы не просто устранить NULL во время ввода? Посмотрите данные перед вызовом 'fwrite()' (или любым другим способом, который вы пишете) и соответствующим образом скорректируйте размер? Это, конечно, займет меньше времени, чем просмотр содержимого файла после каждой записи, и если ваши данные имеют значения NULL в середине действительного содержимого в настоящее время, вы действительно создаете гораздо больше работы для себя, чем простой 'ftruncate()' решает , – mah

+0

Да, но даже если я говорю, что это не самый удобный способ для этого примера, мне любопытно узнать также об этом (итерации по файлу). – qwerty

Смежные вопросы