在C编程中逐行搜索文件中的单词
我正在尝试编写代码,逐行搜索文件中的单词,并打印包含该单词的行。 函数在C编程中逐行搜索文件中的单词,c,file,search,fgets,strstr,C,File,Search,Fgets,Strstr,我正在尝试编写代码,逐行搜索文件中的单词,并打印包含该单词的行。 函数fgets和getline似乎不起作用 void FindWord(char *word , char *file){ char *line ; line = (char*)malloc(1024) ; int fd ; fd = open(file , O_RDONLY ); while (fgets(line , sizeof(line) ,fd )!= NULL) { if
fgets
和getline
似乎不起作用
void FindWord(char *word , char *file){
char *line ;
line = (char*)malloc(1024) ;
int fd ;
fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)
{
if (strstr(line , word )!= NULL)
{
printf("%s",line);
}
}
}
问题1
fgets()
需要的是文件*
而不是文件描述符
改变
int fd ;
fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)
到
并使用fp
作为fgets
的参数
问题2
sizeof(line)
的计算结果不会达到您可能期望的1024
。它只计算指针的大小,很可能是4
或8
改变
int fd ;
fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)
到
更新
另外,由于您在调用malloc
时硬编码1024,因此您还可以使用数组。然后,您可以使用sizeof(line)
问题1
fgets()
需要的是文件*
而不是文件描述符
改变
int fd ;
fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)
到
并使用fp
作为fgets
的参数
问题2
sizeof(line)
的计算结果不会达到您可能期望的1024
。它只计算指针的大小,很可能是4
或8
改变
int fd ;
fd = open(file , O_RDONLY );
while (fgets(line , sizeof(line) ,fd )!= NULL)
到
更新
另外,由于您在调用malloc
时硬编码1024,因此您还可以使用数组。然后,您可以使用sizeof(line)
有两件事是错的
- 如果不需要,您不应该使用
和文件描述符。 另外,open
需要fgets
作为3。参数,而不是文件描述符。使用文件
宏:文件
FILE *f = fopen("myfile.txt", "r"); // Use f here fclose(f);
- 其次,您分配了内存,但从未释放它
char *line = malloc(1024 /* *sizeof(char)*/); //Some code here free(line);
返回指针的大小,而不是缓冲区大小sizeof(line)
读取的是fgets(行,n,f)
字节,而不是行。它最多读取n
字节,在'\n'或EOF上停止。改用n
getline
char *line_buffer = NULL; size_t n = 0; FILE *f = fopen(...); getline(&line_buffer, &n, f); //use here fclose(f); free(line_buffer);
void FindWord(char *word , char *file){
char *line = NULL;
size_t n = 0;
FILE *f = fopen(file, "r") ;
while (getline(&line_buffer, &n, f) != -1)
{
if (strstr(line , word )!= NULL)
{
printf("%s",line);
}
}
fclose(f);
free(line);
}
有两件事是错的
- 如果不需要,您不应该使用
和文件描述符。 另外,open
需要fgets
作为3。参数,而不是文件描述符。使用文件
宏:文件
FILE *f = fopen("myfile.txt", "r"); // Use f here fclose(f);
- 其次,您分配了内存,但从未释放它
char *line = malloc(1024 /* *sizeof(char)*/); //Some code here free(line);
返回指针的大小,而不是缓冲区大小sizeof(line)
读取的是fgets(行,n,f)
字节,而不是行。它最多读取n
字节,在'\n'或EOF上停止。改用n
getline
char *line_buffer = NULL; size_t n = 0; FILE *f = fopen(...); getline(&line_buffer, &n, f); //use here fclose(f); free(line_buffer);
void FindWord(char *word , char *file){
char *line = NULL;
size_t n = 0;
FILE *f = fopen(file, "r") ;
while (getline(&line_buffer, &n, f) != -1)
{
if (strstr(line , word )!= NULL)
{
printf("%s",line);
}
}
fclose(f);
free(line);
}
我可以使用哪些函数来处理作为fgets()的open()?1)使用fopen()2)关于malloc(),在C中,不要强制转换返回值3)关于malloc(),始终检查(!=NULL)返回值以确保操作成功。4) 始终检查任何open/fopen函数调用的返回值(!=NULL)。5) 使用fopen(文件名为“r”),那么fgets和getline就可以工作了。请阅读您在代码中使用的那些函数的手册。例如,open()返回一个小整数,但fgets和getline需要一个指向文件描述符的指针。“sizeof(line)”,其中line由以下语句声明:“char*line;”将在第一条注释中返回4,而不是malloc()@user3629249分配的字节数,第(1)点:
open
使用起来不错fopen
也在其内部使用open
fopen
只是一个库调用,open
是一个系统调用。两者都做同样的工作。只是fopen的fopen
更容易使用。但是你不能说fopen
比open
好。所以你的观点是错误的。我可以用什么函数来处理作为fgets()的open()?1)使用fopen()2)关于malloc(),在C中,不要强制转换返回值3)关于malloc(),始终检查(!=NULL)返回值以确保操作成功。4) 始终检查任何open/fopen函数调用的返回值(!=NULL)。5) 使用fopen(文件名为“r”),那么fgets和getline就可以工作了。请阅读您在代码中使用的那些函数的手册。例如,open()返回一个小整数,但fgets和getline需要一个指向文件描述符的指针。“sizeof(line)”,其中line由以下语句声明:“char*line;”将在第一条注释中返回4,而不是malloc()@user3629249分配的字节数,第(1)点:open
使用起来不错fopen
也在其内部使用open
fopen
只是一个库调用,open
是一个系统调用。两者都做同样的工作。只是fopen的fopen
更容易使用。但是你不能说fopen
比open
好。所以你的观点是错误的。在文件的顶部添加#include
。还有哪些函数可以作为fgets与open()一起使用?你可以使用fread
,但该函数不会在行尾停止读取。它也不会添加终止的空字符fgets
是您最好的选择。@Hadeel阅读了文档。如果函数读取整数参数(文件描述符),则可以将打开返回的整数传递给它。如果需要文件*,则不能。但您可以使用fdopen
从文件描述符创建文件*。换句话说,如果您有一个文件描述符fd
,并且希望使用fgets
,只需执行以下操作:file*fp=fdopen(fd,“r”);如果(*fp!=NULL){fgets(…,…,fp);…}
如果每行只包含一个我应该保存在数组中的数字,该怎么办?我也可以使用FGET吗?大小的值是多少?在文件的顶部添加#include
。还有哪些函数可以作为fgets与open()一起使用?您可以使用fread
,但是