Работа с файлами. Успешная компиляция, но ошибка при вводе данных - C (СИ)

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

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

Не знаю с чем связан вылет программы...
Листинг программы
  1. #include <stdio.h>
  2. #include <io.h>
  3. #include <unistd.h>
  4.  
  5. char *word(FILE *f,int n)
  6. { char c;
  7. char w[n];
  8. int i;
  9. i=0;
  10. do
  11. fscanf(f,"%c",&c);
  12. while (c<=' ');
  13. while (c>' ')
  14. {
  15. w[i]=c;
  16. i++;
  17. fscanf(f,"%c",&c);
  18. }
  19. if (w[i]<=' ')
  20. {
  21. if (w[i]!='\0')
  22. {
  23. w[i]='\0';
  24. return strlen(w);
  25. }
  26. else return(0);
  27. }
  28. else return(-1);
  29. }
  30.  
  31. int strlen (char * a)
  32. {
  33. int i=0;
  34. while (a[i]!='\0')
  35. i++;
  36. return i;
  37. }
  38. int main()
  39. {
  40. int n,j,k,t,fr;
  41. char name[50];
  42. char *w,c;
  43. j=1;
  44. FILE *f;
  45. //printf("Input name file:");
  46. //gets(name);
  47. printf("vv. max len word ");
  48. scanf("%d",&n);
  49. f=fopen("G:/f.txt","r+");
  50. printf("%p", f);
  51. while (!feof(f))// вот здесь уже программа не реагирует..
  52. {
  53. t=word(f,n);
  54. fr=ftell(f)+strlen(w)+1;
  55. if (t>0)
  56. {
  57. fseek(f,j,0);
  58. fputs(w,f);
  59. j=j+t+1;
  60. }
  61. else
  62. if (k=-1)
  63. do
  64. fscanf(f,"%c",&c);
  65. while (c>' ');
  66. fseek(f,fr,0);
  67. }
  68. ftruncate(f,j);
  69. fclose(f);
  70. return 0;
  71. }

Решение задачи: «Работа с файлами. Успешная компиляция, но ошибка при вводе данных»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <unistd.h>
  3.  
  4.  
  5. int word(FILE *f,int n,char *w)
  6. { char c;
  7.   int i;
  8.   i=0;
  9.   do
  10.   fscanf(f,"%c",&c);
  11.   while (c<=' ');
  12.   while (c>' ' && i<n)
  13.   {
  14.     w[i]=c;
  15.     i++;
  16.     fscanf(f,"%c",&c);
  17.   }
  18.  
  19.   if (c<=' ')
  20.   {
  21.     if (c!='\0')
  22.     {
  23.       w[i]='\0';
  24.       return 1;
  25.     }
  26.     else return(0);
  27.   }
  28.   else return(-1);
  29. }
  30.  
  31.  
  32. int strlen (char * a)
  33. {
  34.    int i=0;
  35.     while (a[i]!='\0')
  36.       i++;
  37.     return i;
  38. }
  39.  
  40.   int main()
  41. {
  42.   int n,j,k,t,fr,i;
  43.   char name[50];
  44.   char *w,c;
  45.   j=0;
  46.   FILE *f;
  47.   fr=0;
  48.  //printf("Input name file:");
  49.   //gets(name);
  50.   printf("vv. max len word ");
  51.   scanf("%d",&n);
  52.   f=fopen("G:/f.txt","r+");
  53.    printf("%p", f);
  54.   w=(char *)malloc(n*sizeof(char));
  55.   while (!feof(f))
  56.   {
  57.    t=word(f,n,w);
  58.    fr=fr+strlen(w);
  59.     //printf(" viv %d\n", ftell(f));
  60.     printf(" viv %d\n",strlen(w));
  61.    printf(" viv1 %d\n", fr);
  62.    if (t>0)
  63.     {
  64.     fseek(f,j,0);
  65.     fputs(w,f);
  66.     fprintf(f,' ');
  67.     j=ftell(f);
  68.     fseek(f,fr,0);
  69.     }
  70.     else
  71.         if (t=-1)
  72.         {
  73.             fseek(f,fr,0);
  74.            do
  75.             fscanf(f,"%c",&c);
  76.            while (c>' ');
  77.            fr=ftell(f);
  78.         }
  79.   }
  80.   ftruncate(f,j);
  81.   fclose(f);
  82.   return 0;
  83. }

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

  1. В начале кода подключаются две библиотеки: stdio.h и unistd.h. Библиотека stdio.h используется для ввода-вывода данных, а unistd.h содержит функции для работы с файлами и директориями.
  2. Далее определены две функции: word и strlen. Функция word считывает слова из файла до определенного символа (например, пробела), сохраняет их в массив и возвращает значение 1 или -1 в зависимости от того, было ли достигнуто максимальное количество символов или нет. Функция strlen вычисляет длину строки.
  3. В функции main создается массив name для хранения имени файла, а также выделяется память под массив символов w с помощью функции malloc.
  4. Затем открывается файл с помощью функции fopen. Файл будет открыт для чтения и записи.
  5. В цикле while считываются слова из файла с помощью функции word. Если слово успешно считано, оно записывается обратно в файл после смещения, равного текущей позиции файла. После записи слова в файл в цикле выводится текущая позиция файла.
  6. Если слово не может быть считано (т.е. достигнут конец файла или встречен символ, не являющийся буквой), код переходит к блоку else. Если в этом блоке встречено слово -1, код пытается вернуться к предыдущему символу, считывая все символы до него.
  7. После окончания цикла файл обрезается до текущей позиции с помощью функции ftruncate, а затем закрывается с помощью функции fclose.
  8. В конце функции main возвращается значение 0, что означает успешное выполнение программы.

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


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

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

9   голосов , оценка 3.667 из 5

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

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

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