Некорректная работа программы по работе с файлами - добавляется лишний символ - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Есть вот такая вот программа. Она работает корректно, за исключением одного но: в конце она добавляет символ 'я'. Путем переделки цикла while я выяснил, что компилятор почему-то путает символ 'я' с символом конца файла. Почему? Первый код:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 30
  4. int main(int argc, char *argv[])
  5. {
  6. char c;
  7. char namein[N],nameout[N];
  8. int t=0;
  9. FILE *f;
  10. FILE *f2;
  11. if(argc==1)
  12. {
  13. printf("Input file name?\n");
  14. scanf("%s", namein);
  15. printf("Output file name?\n");
  16. scanf("%s", nameout);
  17. }
  18. if(argc==2)
  19. {
  20. strcpy(namein,argv[1]);
  21. printf("Output file name?\n");
  22. scanf("%s", nameout);
  23. }
  24. if(argc==3)
  25. {
  26. strcpy(namein,argv[1]);
  27. strcpy(nameout,argv[2]);
  28. }
  29. if((f=fopen(namein,"r"))== NULL)
  30. {
  31. printf("Error \n");
  32. return 1;
  33. }
  34. if((f2=fopen(nameout,"w")) == NULL)
  35. {
  36. printf("Error \n");
  37. return 1;
  38. }
  39. while (!feof(f))
  40. {
  41. c=getc(f);
  42. if (c!='.')
  43. { if(c!='\n')
  44. fputc(c,f2);
  45. else fputc(' ',f2);
  46. }
  47. else if(t!=1) {
  48. fputc(c,f2);
  49. t++;
  50. }
  51. else {
  52. fputc(c,f2);
  53. fputc('\n',f2);
  54. t=0;
  55. }
  56. }
  57. fclose(f);
  58. fclose(f2);
  59. }
Переделанный цикл while:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 30
  4. int main(int argc, char *argv[])
  5. {
  6. char c;
  7. char namein[N],nameout[N];
  8. int t=0;
  9. FILE *f;
  10. FILE *f2;
  11. if(argc==1)
  12. {
  13. printf("Input file name?\n");
  14. scanf("%s", namein);
  15. printf("Output file name?\n");
  16. scanf("%s", nameout);
  17. }
  18. if(argc==2)
  19. {
  20. strcpy(namein,argv[1]);
  21. printf("Output file name?\n");
  22. scanf("%s", nameout);
  23. }
  24. if(argc==3)
  25. {
  26. strcpy(namein,argv[1]);
  27. strcpy(nameout,argv[2]);
  28. }
  29. if((f=fopen(namein,"r"))== NULL)
  30. {
  31. printf("Error \n");
  32. return 1;
  33. }
  34. if((f2=fopen(nameout,"w")) == NULL)
  35. {
  36. printf("Error \n");
  37. return 1;
  38. }
  39. while ((c=getc(f))!=EOF)
  40. {
  41. if (c!='.')
  42. { if(c!='\n')
  43. fputc(c,f2);
  44. else fputc(' ',f2);
  45. }
  46. else if(t!=1) {
  47. fputc(c,f2);
  48. t++;
  49. }
  50. else {
  51. fputc(c,f2);
  52. fputc('\n',f2);
  53. t=0;
  54. }
  55. }
  56. fclose(f);
  57. fclose(f2);
  58. }

Решение задачи: «Некорректная работа программы по работе с файлами - добавляется лишний символ»

textual
Листинг программы
  1. while(true)
  2. {
  3.     c=getc(f);
  4.     if(feof(f))
  5.        break;
  6. ....

Объяснение кода листинга программы

  1. В коде представлен бесконечный цикл while(true), который выполняется до тех пор, пока не будет достигнут конец файла (feof(f)).
  2. В каждой итерации цикла считывается один символ из файла с помощью функции getc(f) и сохраняется в переменную c.
  3. Если достигнут конец файла (feof(f)), то цикл прерывается.
  4. В данном случае в вопросе не представлен весь код, поэтому невозможно точно сказать, что происходит после этого. Но обычно в таких случаях происходит обработка полученного символа или его запись в файл.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы