C语言逐行查找文件中的单词
Search for a word in file line by line in C programming
我正在尝试编写代码逐行搜索文件中的单词并打印包含该单词的行。
函数 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()
需要 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);
}
}
}
有几件事是错误的。
如果没有必要,您不应该使用 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)
returns 指针的大小,而不是缓冲区大小。
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);
}
我正在尝试编写代码逐行搜索文件中的单词并打印包含该单词的行。
函数 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()
需要 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);
}
}
}
有几件事是错误的。
如果没有必要,您不应该使用
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)
returns 指针的大小,而不是缓冲区大小。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);
}