如何在这段代码中使用fgets?

时间:2015-01-26 16:27:00

标签: c fgets

我需要计算文本文件中的单词。 例如,文件包含

“Hans Mustermann Ingo Mustermann 特鲁德Musterfrau 特鲁德穆斯特曼 格尔达·穆斯特“

当我搜索Trude Mustermann时,它应显示5次点击。

我的代码只运行一行,然后停止。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{   
int num =0;
char word[100];
char *string;

FILE *in_file = fopen("test.txt", "r"); //reading the words

if (in_file == NULL)
{
    printf("Dataerror\n"); //if word not found
    exit(-1);
}

else {
    fscanf("%s", word);

    while(!feof(in_file))//search for the word

    {
        fscanf(in_file,"%s", string);
        if(!strstr(string , word))//if hit a word
        num++;
    }

    printf( "%d Hit \n" ,num );
}
return 0;
}

我尝试使用scanf("%[^\n]",word);getchar();,但这没有帮助。

2 个答案:

答案 0 :(得分:1)

这是我很久以前学习C的考试之一。 我记得你需要的东西如下:

#define numWords 2
char * words[numWords] = {"Trude", "Mustermann"};
int counters[numWords] = {0, 0};

void CountWords(char * Buffer)
{
    char *p1=Buffer; 
    char *p2;
    char *p3;
    int i;
    int n=0;

    // initialize the counters
    memset(counters, 0x00, sizeof(counters));

    do
    {
        p2=NULL;
        for (i=0; i < numWords; i++)
        {
            p3=strstr(p1, words[i]);
            if (p3) // found a word 
            {
                // if p2 is null or p3 is before p2
                if (!p2 || p3 <= p2) 
                {
                    p2=p3;
                    n=i;
                }
            }
        }
        if (!p2) break; // no more words
        counters[n]++;
        p1=p2+strlen(words[n]);
    } while (TRUE);

    for (i=0; i < numWords; i++)
    {
        printf("The word '%s' appears %5d time/s\n", words[i], counters[i]); 
    }
}

测试该功能:

CountWords("Hans Mustermann Ingo Mustermann Trude Musterfrau Trude Mustermann Gerda Muster");

如果要从文本文件进行测试,请使用以下命令:

// To read from a file, I'd suggets to read the whole file in memory, 
// and search in that buffer.
if (_sopen_s(&FD, "test.txt", O_RDONLY | O_BINARY, _SH_DENYNO, _S_IREAD)) 
{
    return; // file not found
}
fSize=_lseek(FD, 0, FILE_END); // get file's size
_lseek(FD, 0, FILE_BEGIN); // rewind it
// Allocate memory to read the file's content
if ((Buffer = (char *)malloc(fSize+1)) == NULL) 
{
     _close(FD);
     return; // Not enough memory
}

__try
{
    i=_read(FD, Buffer, fSize);
    _close(FD);
    if (i != fSize) return; // error reading the file
    Buffer[fSize]=NULL;
    CountWords(Buffer);
}
__finally
{
    free(Buffer);
}

要从文件中进行测试,您需要包含以下头文件。

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <share.h>

答案 1 :(得分:0)

fgets()将文件中的下一个输入行读入字符数组 str ,当文件结束时返回NULL,这样fgets()就可以用作循环计数器为文件。

fgets()的语法:

char * fgets(char * str,int maxline,FILE fp)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{   
int num =0;
char word[100];
char str[100];
FILE *in_file = fopen("test.txt", "r+"); //reading the words
if (in_file == NULL)
{
         //if word not found
    printf("DataError\n");
    exit(-1);

}

else {
    fscanf(in_file,"%s", word);
    //printf("%s\n",word);
    while(fgets(str,100,in_file))//search for the word

    {

        if(strstr(str , word))//if hit a word
        {   num++;
            //printf("%s\n",str );
        }
    }

    printf( "%d Hit \n" ,num );
}
return 0;
}