Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

“Странный” символ в конце файла

#c #файлы #ввод


Написал программку для копирования содержимого txt файла из 1 в 2. Почти всё работает,
только я не понимаю как пофиксить запись последнего символа?

#include 
#include 

#define size 101


int main()
{
FILE* read;
FILE* write;

read = fopen("1.txt", "r");
write = fopen("2.txt", "w");

char buffer[size];

char c;



if(read != NULL)
{
   while(c != EOF)
   {
       c = getc(read);
       fprintf(write,"%c", c);
   }

   fclose(read);
   fclose(write);
}

else
{
    printf("File is doesn't exist\n");
}



    


Ответы

Ответ 1



Вы объявляете переменную c, потом проверяете у нее значение, а потом инициализируете. При этом, если getc() вернула EOF вы все равно вызываете запись этого символа в файл fprintf(write,"%c", c); Вам нужно переписать цикл к нормальному виду c = getc(read); while(c != EOF) { fprintf(write,"%c", c); c = getc(read); } При этом переменную c нужно объявить не как char, а как int. Иначе цикл у вас будет прекращаться, как только в файле встретится с кодом 255 (в кодировке Win1251 это буква я).

Ответ 2



char c; Неверно. EOF имеет тип int, когда его урезаешь до char, старшие байты теряются и будет некий символ, который будет ошибочно рассматриваться как EOF (буква я в win1251). while(c != EOF) Не инициализированную переменную сравнивать с чем-то - плохая идея. c = getc(read); fprintf(write,"%c", c); Прочитали символ и вывели. Неизвестно, успешно прочитали или нет - сравнение с EOF будет уже потом, после того, как произойдёт его вывод. При достижении EOF выводится лишняя буква я. Вот правильный код: for (int c; (c=getc(read)) != EOF; ) fprintf(write, "%c", c); Кстати fprintf(write,"%c", c); можно заменить на putc(c, write), но тут по желанию.

Ответ 3



Все не просто просто,а очень просто :) int c; ... while((c = getc(read)) != EOF) { fprintf(write,"%c", c); }

Комментариев нет:

Отправить комментарий