我的问题是我试图只读取给定n个文件的一定数量的文件。
例如,我有两个文件,其中包含以下内容
TEST1:
一只猫跑了
苹果
TEST2:
男孩回家了
苹果是红色的
我希望输出为
test1:一只猫跑掉了
不
test1:一只猫跑掉了
test2:苹果是红色的
这是我到目前为止编写的代码:
#include <stdio.h>
#include <string.h>
int main (int argc, char ** argv)
{
extern int searcher(char * name, char*search,int amount);
while(argc != 0){
if(argv[argc] !=NULL)
if(searcher(argv[argc],"a",1)) break;
argc-- ;
}
}
int searcher(char * name, char*search,int amount){
FILE *file = fopen (name, "r" );
int count = 0;
if (file != NULL) {
char line [1000];
while(fgets(line,sizeof line,file)!= NULL && count != amount)
{
if(strstr(line,search) !=NULL){
count++;
if(count == amount){
return(count);
}
printf("%s:%s\n", line,name);
}
}
fclose(file);
}else {
perror(name); //print the error message on stderr.
}
return(0);
}
答案 0 :(得分:1)
继续发表评论,并注意到您需要删除newline
所包含的尾随fgets
,您可以执行以下操作:
#include <stdio.h>
#include <string.h>
enum { MAXC = 1000 };
int searcher (char *name, char *search, int amount);
void rmlf (char *s);
int main (int argc, char **argv)
{
int i;
for (i = 1; i < argc; i++)
if (searcher (argv[i], "a", 1))
break;
return 0;
}
int searcher (char *name, char *search, int amount)
{
FILE *file = fopen (name, "r");
int count = 0;
if (!file) {
fprintf (stderr, "error: file open failed '%s'.\n", name);
return 0;
}
char line[MAXC] = "";
while (count < amount && fgets (line, MAXC, file)) {
rmlf (line); /* strip trailing \n from line */
if (strstr (line, search)) {
count++;
printf ("%s: %s\n", name, line);
}
}
fclose (file);
return count == amount ? count : 0;
}
/** stip trailing newlines and carraige returns by overwriting with
* null-terminating char. str is modified in place.
*/
void rmlf (char *s)
{
if (!s || !*s) return;
for (; *s && *s != '\n'; s++) {}
*s = 0;
}
示例输入文件
$ cat test1
A cat ran off
Apple
$ cat test2
The boy went home
Apples are red
示例使用/输出
您理解使用argc--
进行迭代,您的文件会被反向处理,因此您最终会得到如下输出:
$ ./bin/searcher test2 test1
test1: A cat ran off
$ ./bin/searcher test1 test2
test2: Apples are red
注意:按顺序处理文件,只需执行for (i = 1; i < argc; i++)
而不是while (argc--)
之类的操作。如果您还有其他问题,请与我们联系。
更改为for
圈而不是while
中的main
并输入10
作为要查找的出现次数,全部处理文件,例如:
$ ./bin/searcher test1 test2
test1: A cat ran off
test2: Apples are red