如何使用 fgets 读取文本文件的不同行?

How can I read different lines of a text file with fgets?

例如,如果 .txt 有

Hello
There.

写在里面,不管fgets(str, N, file)里的N有多大,它只会把"Hello"存到str里,因为遇到'\n'字符就停止了。

那么,如果我想在其中找到一个特定的词,我该如何读取整个文件?

So, how could I read the whole file

为了将整个文件读入内存缓冲区,您可以使用函数 fread. After turning the input into a string by appending a terminating null character, you could then use the function strstr 在输入中搜索特定单词。

这是一个执行此操作并在输入中搜索单词 targetword:

的程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
    FILE *fp;
    char buffer[1000];
    size_t read;

    //open input file
    fp = fopen( "input.txt", "rt" );
    if ( fp == NULL )
    {
        fprintf( stderr, "ERROR: Unable to open input file!\n" );
        exit( EXIT_FAILURE );
    }

    //read entire file into buffer
    read = fread( buffer, 1, sizeof buffer, fp );

    //verify that buffer was not too small
    if ( read == sizeof buffer )
    {
        fprintf( stderr, "ERROR: Memory buffer is too small to contain entire input!\n" );
        exit( EXIT_FAILURE );
    }

    //add terminating null character to make input a valid
    //null-terminated string
    buffer[read] = '[=10=]';

    //search input for target word
    if ( strstr( buffer, "targetword" ) != NULL )
        printf( "Found word!\n" );
    else
        printf( "Did not find word!\n" );

    fclose( fp );
}

但是,不是一次读取整个文件(这可能需要非常大的内存缓冲区),更常见的是在循环中一次读取一行,并且在每次循环迭代中,您检查是否当前行包含您要查找的词。这样一来,内存缓冲区只需足够大即可一次存储一行输入,而不是整个输入。

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

int main( void )
{
    FILE *fp;
    char line[100];
    bool found = false;

    //open input file
    fp = fopen( "input.txt", "rt" );
    if ( fp == NULL )
    {
        fprintf( stderr, "ERROR: Unable to open input file!\n" );
        exit( EXIT_FAILURE );
    }

    //read one line per loop iteration
    while ( fgets( line, sizeof line, fp ) != NULL )
    {
        //verify that line was not too long to fit into buffer
        if ( strchr( line, '\n' ) == NULL )
        {
            fprintf( stderr, "line too long to fit buffer!\n" );
            exit( EXIT_FAILURE );
        }

        //search for target word
        if ( strstr( line, "targetword" ) != NULL )
        {
            found = true;
            break;
        }
    }

    if ( found )
        printf( "Found word!\n" );
    else
        printf( "Did not find word!\n" );

    fclose( fp );
}

但是,这两种解决方案都有几个可能的问题:

  1. 如果目标词 targetword 是另一个词的一部分,例如 thetargetword,那么它会声明它找到了目标词。我不确定这是否是您想要的,或者您是否希望目标词自己出现。

  2. 如果目标词是syllabified,例如,target-\n出现在一行,word出现在下一行,那么程序赢了'找不到这个词。

  3. 搜索区分大小写,所以只会找到targetword,不会找到TargetwordTARGETWORD.

如有必要,所有这些问题都可以解决,但需要额外的工作。