2012-01-08 2 views
0
int writeFile(FILE * handle, char * data, int len) 
{ 
    fseek(handle, 0, SEEK_SET); 
    for(int i=0; i <= len; i++) 
     putc(data[i], handle); 
} 

Когда я вызываю эту функцию, она работает нормально, но если есть символ 0x1A на char * data он будет писать несчетное 0xFF. Почему это?putc() записывает неправильные данные

+1

Почему бы не 'fwrite (data, 1, len, handle)'? –

+0

Как бесчисленное количество бесчисленных 0xFF? Вы уверены, что счетчик - это не просто количество символов после символа 0x1A (control-Z) в строке, которую вы пишете, даете или принимаете ошибку «один за другим» в вашем коде? –

+1

C или C++? Выбери один? Это не код, который вы должны использовать в C++. И если вы не можете рассчитывать, то, возможно, программирование не для вас. –

ответ

2

Вы пишете len+1 символов вместо len символов.

Изменение:

for(int i=0; i <= len; i++) 

к:

for(int i=0; i < len; i++) 

(Обратите внимание, что эта ошибка уже упоминалось в комментариях к предыдущему вопросу - обязательно прочитайте все ваши тщательно ответы и комментарии.)

+0

Dit it. Проблема сохраняется. Я уверен, что это происходит из-за char 0x1A, я все еще не знаю почему. Если я удалю символ 0x1a из данных, он отлично работает – user1091856

+1

@ user1091856: тогда удалите символ 0x1A. Этого не должно быть. –

6

Hex 0x1A также известен как Control-Z.

В Windows (ну, DOS его создал), текстовые файлы указывают EOF, вставив в файл элемент управления-Z.

Если вы хотите записать двоичные данные, убедитесь, что выходной файл открыт как двоичный файл. Если вы открываете его в виде текстового файла, выводите только текст (что означает очень ограниченные контрольные символы, возможно, только табуляции и новые строки), при этом система заботится о CRLF < -> LF mapping).

+0

Ничего себе! Это именно то, что вы сказали. Я добавил аргумент «b» в режиме функции fopen, и он сработал. thanks – user1091856

+0

CPM возникла из-за того, что CPM не хранил размер файла в байтах, а в количестве блоков диска. Конец действительной части файла в последнем блоке был помечен 0x1A. – AProgrammer

+0

@AProgrammer: Спасибо - так или иначе, это меня не удивляет, но я забыл о CP/M. –

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