以下代码一次读取一个字符的文本文件并将其打印到stdout:
#includeint main() { char file_to_open[] = "text_file.txt", ch; FILE *file_ptr; if((file_ptr = fopen(file_to_open, "r")) != NULL) { while((ch = fgetc(file_ptr)) != EOF) { putchar(ch); } } else { printf("Could not open %s\n", file_to_open); return 1; } return(0); }
但是不是打印到stdout [putchar(ch)]而是想在文件中搜索另一个文本文件中提供的特定字符串,即.strings.txt并输出匹配到out.txt的行
text_file.txt
:
1993 - 1999 Pentium 1997 - 1999 Pentium II 1999 - 2003 Pentium III 1998 - 2009 Xeon 2006 - 2009 Intel Core 2
strings.txt
:
Nehalem AMD Athlon Pentium
在这种情况下,三个第一text_file.txt
行将匹配.我已经对C语言中的文件操作做了一些研究,似乎我可以使用fgetc
[像我在我的代码中一样] 读取一个字符,一行fgets
和一个块fread
,但没有单词,因为我认为是完美的在我的情况?
我假设这是一个学习练习,你只是在寻找一个开始的地方.否则,你不应该重新发明轮子.
下面的代码应该让您了解所涉及的内容.它是一个程序,允许您指定要搜索的文件的名称以及在该文件中搜索的单个参数.您应该能够修改它以将短语设置为在字符串数组中搜索,并检查该数组中的任何单词是否出现在读取的任何行中.
您正在寻找的关键功能是strstr
.
#include#include #include #ifdef DEBUG #define INITIAL_ALLOC 2 #else #define INITIAL_ALLOC 512 #endif char * read_line(FILE *fin) { char *buffer; char *tmp; int read_chars = 0; int bufsize = INITIAL_ALLOC; char *line = malloc(bufsize); if ( !line ) { return NULL; } buffer = line; while ( fgets(buffer, bufsize - read_chars, fin) ) { read_chars = strlen(line); if ( line[read_chars - 1] == '\n' ) { line[read_chars - 1] = '\0'; return line; } else { bufsize = 2 * bufsize; tmp = realloc(line, bufsize); if ( tmp ) { line = tmp; buffer = line + read_chars; } else { free(line); return NULL; } } } return NULL; } int main(int argc, char *argv[]) { FILE *fin; char *line; if ( argc != 3 ) { return EXIT_FAILURE; } fin = fopen(argv[1], "r"); if ( fin ) { while ( line = read_line(fin) ) { if ( strstr(line, argv[2]) ){ fprintf(stdout, "%s\n", line); } free(line); } } fclose(fin); return 0; }
样本输出:
E:\Temp> searcher.exe searcher.c char char * char *buffer; char *tmp; int read_chars = 0; char *line = malloc(bufsize); while ( fgets(buffer, bufsize - read_chars, fin) ) { read_chars = strlen(line); if ( line[read_chars - 1] == '\n' ) { line[read_chars - 1] = '\0'; buffer = line + read_chars; main(int argc, char *argv[]) { char *line;