размер файла c отличается от размера строки данных о размере - PullRequest
1 голос
/ 26 мая 2009

У меня есть файл, в который я пишу, а затем меняю его размер в соответствии с размером записанного в него текста, например:

FILE * file...

Я получаю все данные из файла и изменяю размер файла на размер данных, но он отличается. Размер строки меньше длины файла, он обрезает ее и теряет данные. В чем может быть проблема?

while(fgets(cLine, sizeof(cLine), file) )
    str.append((string)cLine);
fputs(str.c_str(),file);
_chsize( fileno(file), (int)str.size() );

Когда я проверял это всегда fileLength(fileno(file)) больше str.size()!

Ответы [ 3 ]

9 голосов
/ 26 мая 2009

Возможно, это CRLF? Остерегайтесь:

fopen(filename, "r") против fopen(filename, "rb"),

и аналогично

fopen(filename, "w") против fopen(filename, "wb").

Причина в том, что "r" или "w" будет переводить CRLF, а "rb" или "wb" будут обрабатывать данные как двоичные. На большинстве платформ это игнорируется. Например, справочная страница fopen в OS X :

Строка режима также может включать буква "б" либо как третья символ или как символ между персонажи в любом из двухсимвольные строки, описанные выше. Это строго для совместимости с ISO / IEC 9899: 1990 («ISO C90») и не имеет никакого эффекта; «б» игнорироваться.

Страница fopen на MSDN говорит что-то другое:

б

Открыть в двоичном (непереведенном) режиме; переводы, связанные с возвратом каретки и символы перевода строки подавлено.

Если t или b не задано в режиме, то режим перевода по умолчанию определяется глобальная переменная _fmode . Если т или b префикс к аргументу, функция завершается ошибкой и возвращает NULL .

Для получения дополнительной информации об использовании текста и бинарные режимы в Юникоде и многобайтовый потоковый ввод-вывод, см. Текст и Двоичный режим файлов ввода / вывода и Unicode Потоковый ввод / вывод в текстовом и двоичном режимах .

1 голос
/ 26 мая 2009

Джонатан ударил гвоздь по голове.

Убедитесь, что вы читаете файл в двоичном формате или если вы уверены, что файл содержит только текст (и это все, что вам нужно), то подготовьтесь к тому, чтобы символы файла были в формате Юникод или в каком-либо другом формате.

Вы также обнаружите, что автоматически добавляются дополнительные управляющие символы, не в последнюю очередь символ EOF.

Мой вопрос, однако, почему вы читаете данные из файла только для того, чтобы записать их снова?

1 голос
/ 26 мая 2009

В зависимости от того, что вы делаете в своем коде для cr / lf, и от того, какую ОС вы используете, при чтении / записи файла может произойти перевод в фоновом режиме, если вы откроете его в текстовом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...