如何从C中的文件中读取特定数量的行

时间:2016-06-26 06:26:07

标签: c file output

我的问题是我试图只读取给定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);
}

1 个答案:

答案 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