#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); }
Комментариев нет:
Отправить комментарий