我正在尝试编写代码来逐行搜索文件中的单词并打印包含该单词的行。
功能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);
}
}
}
答案 0 :(得分:4)
问题1
fgets()
需要FILE*
而非文件描述符。
更改
int fd ;
fd = open(file , O_RDONLY );
到
FILE* fp = fopen(file, "r");
并使用fp
作为fgets
的参数。
问题2
正如您可能期望的那样, sizeof(line)
不会评估为1024
。它只是评估指针的大小,最有可能是4
或8
。
更改
while (fgets(line , sizeof(line) ,fd )!= NULL)
到
while (fgets(line , 1024, fp )!= NULL)
<强>更新强>
此外,由于您在调用malloc
时硬编码1024,因此您也可以使用数组。然后,您可以使用sizeof(line)
。
void FindWord(char *word , char *file){
char line[1024] ;
FILE* fp = fopen(file, "r") ;
while (fgets(line , sizeof(line) , fp )!= NULL)
{
if (strstr(line , word )!= NULL)
{
printf("%s",line);
}
}
}
答案 1 :(得分:0)
有些事情是错误的。
如果您不需要,则不应使用open
并使用文件描述符。
此外,fgets
需要FILE
作为3.参数,而不是文件描述符。使用FILE
宏:
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(line , n , f)
读取。它最多读取n
个字节,而不是行n
个字节,在'\ n'或EOF上停止。请改用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);
}