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