如何使用 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 );
}
但是,这两种解决方案都有几个可能的问题:
如果目标词 targetword
是另一个词的一部分,例如 thetargetword
,那么它会声明它找到了目标词。我不确定这是否是您想要的,或者您是否希望目标词自己出现。
如果目标词是syllabified,例如,target-\n
出现在一行,word
出现在下一行,那么程序赢了'找不到这个词。
搜索区分大小写,所以只会找到targetword
,不会找到Targetword
或TARGETWORD
.
如有必要,所有这些问题都可以解决,但需要额外的工作。
例如,如果 .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 );
}
但是,这两种解决方案都有几个可能的问题:
如果目标词
targetword
是另一个词的一部分,例如thetargetword
,那么它会声明它找到了目标词。我不确定这是否是您想要的,或者您是否希望目标词自己出现。如果目标词是syllabified,例如,
target-\n
出现在一行,word
出现在下一行,那么程序赢了'找不到这个词。搜索区分大小写,所以只会找到
targetword
,不会找到Targetword
或TARGETWORD
.
如有必要,所有这些问题都可以解决,但需要额外的工作。