Работа с файлами. Успешная компиляция, но ошибка при вводе данных - 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д