奇怪的Scanf问题

时间:2009-11-30 16:01:45

标签: c

我正在尝试完成将字符串与文本文件进行比较的家庭作业程序,因此用户基本上可以在文本文件中搜索文件中的搜索词(字符串)。我到了那里:)

然而今天我遇到了一个非常奇怪的问题。当它要求搜索的术语我输入文本时,它永远不会结束。我可以整天打字,它仍然要求输入。我忽略了什么奇怪的问题?新鲜的眼睛可能会有所帮助:)

/*
 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 个答案:

答案 0 :(得分:2)

以附加模式打开文件:

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

然后你尝试从中读取。

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

首次尝试解决问题,我会尝试打开文件进行读取,在循环内读取文件并关闭文件。然后再次打开它,这次是为了添加mystring那里(以及fclose)。

一旦有效,如果你愿意,试着看看“阅读和追加模式”是否有效......

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

答案 1 :(得分:1)

你不需要“&amp; mystring”,“mystring”已经是数组的地址。

最好使用gets或getline。

您正在将搜索字符串读入mystring,但之后您还将文件内容读入mystring。

答案 2 :(得分:0)

当你点击Enter并且只将字符存储到空格时结束。

答案 3 :(得分:0)

我认为pmg已经遇到了实际问题;你已经在附加模式下打开了文件,根据我的H&amp; S副本,不允许从附加流中读取。您必须打开它“a +”(追加/更新)才能读取来编写流。

在检查之前,您应该始终检查*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
   */
}