Странная проблема Scanf - PullRequest
       9

Странная проблема Scanf

0 голосов
/ 30 ноября 2009

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

Однако сегодня я сталкиваюсь с очень странной проблемой. Когда он запрашивает термин для поиска, я ввожу текст, но он никогда не заканчивается. Я мог печатать весь день, и он все еще просит ввода. Какие странные проблемы я пропускаю? Может помочь свежая пара глаз:)

/*
 ask the user for a word
 convert user word to LOWER CASE
 open output file
 open input file
 test to be sure input file is open
 search for target word and keep count --> how??
 print results to monitor
 write results to file
 close files
 */
#include<stdio.h>
#include<stdlib.h>

int main (void)
{
    //declare 
    int i =0;
    int count = 0;

    /*************************************************************
     working with arrays and strings
    *************************************************************/
    char mystring[50]; //what user puts in
    char target[50]; //the word in the file we are looking for

    printf("input your message ");
    scanf("%s", mystring);
    //printf("%s", mystring);


    /*************************************************************
     find file, write to it, output the string, end and close file
    **************************************************************/

    //define text file to use
    FILE *cfile;
    //name of file == file
    cfile = fopen("./thanksgiving_proclamation.txt", "a");

    //error handling if file does not exist
    if(cfile == NULL) printf("Cannot open file");

    /*************************************************************
             parse through file and search for string
    **************************************************************/ 
    //convert string to lowercase
    for(i = 0; i < /*strlen(mystring)*/ 500; i++)//convert to string length
    {
        if(target[i] >= 'A' && target[i] <='Z')
            //convert char between a and z into lowercase
            target[i] = target[i] + 32; //makes uppercase char
    }

    //compare our strings
    do{
        //scan through file
        fscanf(cfile, "%s", mystring);  

        //convert string to lowercase
        for(i = 0; i < /*strlen(mystring)*/ 300; i++)//convert to string length
        {
            if(mystring[i] >= 'A' && mystring[i] <='Z')
                //convert char between a and z into lowercase
                mystring[i] = mystring[i] + 32; //makes uppercase char
        }
        if(strcmp(mystring, target) == 0)
            count++;
    }while(!feof(cfile));

    //while(strcmp(target,"quit")!=0)//end loop


    //print to file
    fprintf(cfile, "%s", mystring);

    //close file
    fclose(cfile);

    //show user file has been written
    printf("\nSuccess. File has been written\n");


    printf("Press Enter to Continue...");
    getchar();
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

Вы открываете файл в режиме добавления:

cfile = fopen("...", "a");

и затем вы пытаетесь читать с него.

fscanf(cfile, "%s", mystring);

Для первой попытки решения проблемы я бы попытался открыть файл для чтения, прочитать его внутри цикла и закрыть файл. Затем откройте его снова, на этот раз, чтобы добавить туда mystringfclose).

Как только это сработает, если хотите, попробуйте проверить, работает ли открытие в «режиме чтения и добавления» ...

cfile = fopen("...", "a+");
1 голос
/ 30 ноября 2009

Вам не нужно "& mystring", "mystring" уже является адресом массива.

Было бы лучше использовать get или getline.

Вы читаете строку поиска в mystring, но затем также читаете содержимое файла в mystring.

0 голосов
/ 30 ноября 2009

Я думаю, что pmg ударил по актуальной проблеме; Вы открыли файл в режиме добавления, и, согласно моей копии H & S, чтение из потока добавления не разрешено. Вы должны открыть его «+» (добавить / обновить), чтобы прочитать и записать поток.

Вы должны всегда проверять результат вызова *scanf() (fscanf(), sscanf(), scanf() и т. Д.) На успех до проверки feof() или ferror(), и Вы никогда не должны ставить feof() условие проверки цикла (поскольку оно не вернет true до тех пор, пока после вы не попытаетесь прочитать после конца файла, ваш цикл всегда будет выполняться слишком много раз) ,

Я бы изменил ваш цикл на что-то вроде этого:

for(;;)
{
  if (fscanf(cfile, "%s", mystring) != 1)
  {
    if (feof(cfile)) 
    {
      fprintf(stderr, "Reached end of file!\n");
      break; // exit loop
    }
    if (ferror(cfile)) 
    {
      fprintf(stderr, "Error while reading from file!\n");
      break;
    }
  }
  /**
   * continue as before
   */
}
0 голосов
/ 30 ноября 2009

Он заканчивается, когда вы нажимаете Enter и сохраняет символы только до пробела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...