Работа с файлами. Успешная компиляция, но ошибка при вводе данных - C (СИ)
Формулировка задачи:
Не знаю с чем связан вылет программы...
Листинг программы
- #include <stdio.h>
- #include <io.h>
- #include <unistd.h>
- char *word(FILE *f,int n)
- { char c;
- char w[n];
- int i;
- i=0;
- do
- fscanf(f,"%c",&c);
- while (c<=' ');
- while (c>' ')
- {
- w[i]=c;
- i++;
- fscanf(f,"%c",&c);
- }
- if (w[i]<=' ')
- {
- if (w[i]!='\0')
- {
- w[i]='\0';
- return strlen(w);
- }
- else return(0);
- }
- else return(-1);
- }
- int strlen (char * a)
- {
- int i=0;
- while (a[i]!='\0')
- i++;
- return i;
- }
- int main()
- {
- int n,j,k,t,fr;
- char name[50];
- char *w,c;
- j=1;
- FILE *f;
- //printf("Input name file:");
- //gets(name);
- printf("vv. max len word ");
- scanf("%d",&n);
- f=fopen("G:/f.txt","r+");
- printf("%p", f);
- while (!feof(f))// вот здесь уже программа не реагирует..
- {
- t=word(f,n);
- fr=ftell(f)+strlen(w)+1;
- if (t>0)
- {
- fseek(f,j,0);
- fputs(w,f);
- j=j+t+1;
- }
- else
- if (k=-1)
- do
- fscanf(f,"%c",&c);
- while (c>' ');
- fseek(f,fr,0);
- }
- ftruncate(f,j);
- fclose(f);
- return 0;
- }
Решение задачи: «Работа с файлами. Успешная компиляция, но ошибка при вводе данных»
textual
Листинг программы
- #include <stdio.h>
- #include <unistd.h>
- int word(FILE *f,int n,char *w)
- { char c;
- int i;
- i=0;
- do
- fscanf(f,"%c",&c);
- while (c<=' ');
- while (c>' ' && i<n)
- {
- w[i]=c;
- i++;
- fscanf(f,"%c",&c);
- }
- if (c<=' ')
- {
- if (c!='\0')
- {
- w[i]='\0';
- return 1;
- }
- else return(0);
- }
- else return(-1);
- }
- int strlen (char * a)
- {
- int i=0;
- while (a[i]!='\0')
- i++;
- return i;
- }
- int main()
- {
- int n,j,k,t,fr,i;
- char name[50];
- char *w,c;
- j=0;
- FILE *f;
- fr=0;
- //printf("Input name file:");
- //gets(name);
- printf("vv. max len word ");
- scanf("%d",&n);
- f=fopen("G:/f.txt","r+");
- printf("%p", f);
- w=(char *)malloc(n*sizeof(char));
- while (!feof(f))
- {
- t=word(f,n,w);
- fr=fr+strlen(w);
- //printf(" viv %d\n", ftell(f));
- printf(" viv %d\n",strlen(w));
- printf(" viv1 %d\n", fr);
- if (t>0)
- {
- fseek(f,j,0);
- fputs(w,f);
- fprintf(f,' ');
- j=ftell(f);
- fseek(f,fr,0);
- }
- else
- if (t=-1)
- {
- fseek(f,fr,0);
- do
- fscanf(f,"%c",&c);
- while (c>' ');
- fr=ftell(f);
- }
- }
- ftruncate(f,j);
- fclose(f);
- return 0;
- }
Объяснение кода листинга программы
- В начале кода подключаются две библиотеки: stdio.h и unistd.h. Библиотека stdio.h используется для ввода-вывода данных, а unistd.h содержит функции для работы с файлами и директориями.
- Далее определены две функции: word и strlen. Функция word считывает слова из файла до определенного символа (например, пробела), сохраняет их в массив и возвращает значение 1 или -1 в зависимости от того, было ли достигнуто максимальное количество символов или нет. Функция strlen вычисляет длину строки.
- В функции main создается массив name для хранения имени файла, а также выделяется память под массив символов w с помощью функции malloc.
- Затем открывается файл с помощью функции fopen. Файл будет открыт для чтения и записи.
- В цикле while считываются слова из файла с помощью функции word. Если слово успешно считано, оно записывается обратно в файл после смещения, равного текущей позиции файла. После записи слова в файл в цикле выводится текущая позиция файла.
- Если слово не может быть считано (т.е. достигнут конец файла или встречен символ, не являющийся буквой), код переходит к блоку else. Если в этом блоке встречено слово
-1
, код пытается вернуться к предыдущему символу, считывая все символы до него. - После окончания цикла файл обрезается до текущей позиции с помощью функции ftruncate, а затем закрывается с помощью функции fclose.
- В конце функции main возвращается значение 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д