больше понимания с помощью fseek () и EOF IN C - PullRequest
0 голосов
/ 05 декабря 2011

fseek и значение 0L в fseek, что означает это значение, также seek_end означает, что end также помогает мне с EOF ctrl + z не работает

void modify()
{
 int ch1;
 FILE *f1;
 char c,*word,*sent,fname[20];
 printf("Enter the filename to be modified: ");
 scanf("%s",fname);
 if(searchpath(fname))
    {
    printf("\n1.Character");
    printf("\n2.Word");
    printf("\n3.Sentence");
    printf("\nEnter U'r choice: ");
    scanf("%d",&ch1);
    if(ch1==1)
       {
       f1=fopen(fname,"a+");//use to search the fiel in path variables
       fseek(f1, 0L, SEEK_END);
       printf("Enter the character and CTRL+Z to exit:\n ");
       while((c=getchar())!=EOF)
          {
          putc(c,f1);
          }
       }
    else if(ch1==2)
       {
       printf("Enter the word: ");
       scanf("%s",word);
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       fputs(word,f1);
       }
    else
       {
       printf("Enter the sentence and CTRL+Z to exit: ");
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       while((c=getchar())!=EOF)
         {
         putc(c,f1);
         }
       }
    }
 else
 printf("\nFilename does not exist");
 fclose(f1);
 }

когда я запускаю код и вызываю printf («Введите символ и CTRL + Z для выхода: \ n»);while ((c = getchar ())! = EOF) {putc (c, f1);} и когда я нажимаю ctrl + z я получил -> стрелка и введите, я достигну бесконечного цикла, также используя fflush (stdin);он потерял адрес файла и захватил какой-то мусорный адрес,

1 Ответ

1 голос
/ 05 декабря 2011

У вас есть пара проблем, и я сохраню большую до последнего.

Во-первых, возможно, что ваш бесконечный цикл является результатом того, как вы используете getchar.

getchar возвращает значение символа, считанного из стандартного ввода. Он возвращает EOF (зависящее от платформы значение, но обычно -1) в случае ошибки или конца файла. Однако конец файла (возможно, в зависимости от вашей платформы) действительно происходит только в том случае, если вы перенаправили файл в stdin при вызове программы, т.е. если есть файл, который может завершиться.

CTRL-Z на некоторых платформах может интерпретироваться как конец файла, как и CTRL-D, но это, конечно, не универсально, и я не уверен ни в одной из них.

Если CTRL-Z не интерпретируется как конец файла, это может привести к двум возможным результатам. Одним из них является принудительное прерывание вашей программы, немного похожее на CTRL-Break в командной строке Windows. Другое - CTRL-Z обрабатывается как нажатие клавиши так же, как и любое другое, что, вероятно, приводит к тому, что код символа 26 возвращается из getchar.

Далее, я не думаю, что вам вообще нужен fseek, так как ваш режим открытия - "+", хотя он и для меня не выглядит неправильно - но я недостаточно использую C, чтобы быть уверенным в этом.

Наконец - я также думаю, что у вас есть серьезная проблема в том, как вы используете scanf, которая вызывает серьезное неопределенное поведение. Возьмите следующую строку ...

scanf("%s",word);

Ваша переменная word определяется следующим образом ...

char c,*word,*sent,fname[20];

ОК, это указатель на символ, но этот указатель не инициализирован. Вам нужен буфер памяти для хранения входного текста, и вам нужно инициализировать указатель. Обычно проще объявить word как массив символов, например ...

char word [100];

Это гарантирует наличие некоторой памяти, доступной для хранения результирующей строки, но не гарантирует, что буфер памяти достаточно большой. Этот момент является серьезным для программирования в реальном мире, но, вероятно, это не то, о чем вы должны беспокоиться в данный момент.

Странно, что вы, похоже, уже решили эту проблему для fname. Это говорит о том, что вы можете автоматически применять предложения пользователей для исправления кода, не понимая проблем, что немного беспокоит. Поэтому я дам вам предупреждение - кажется, вы не используете sent в данный момент, но если он предназначен для использования так же, как word и fname, у него будет та же проблема что word имеет.

...