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

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

  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
Похожие ответы