为多个文件调用两次fgets

时间:2015-08-28 06:36:11

标签: c shell input

我有两个名为id.txt和name.txt的文件。

id和name的内容分别为:

12345
23456
34567
45678
56789
67890

abcde
bcdef
cdefg
defgh
efghi
fghij

问题是要将其存储在数组中,我必须从命令行读取输入

这是我的主要代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 10

int main(int argc, const char *argv[])
{
    char id[MAX];
    char name[MAX];

    while(fgets(id, sizeof id, stdin) != NULL)  
    {
        printf("ID: %s\n",id);
    }

    while(fgets(name, sizeof name, stdin) != NULL)
    {
        printf("Name: %s\n",name);
    }   
    return 0;
}

最后一点是我必须在命令行中重定向输入文件。

所以到目前为止我的命令行参数是:

 gcc -Wall -ansi -o main main.c     
 ./main < id.txt name.txt

输出结果为:

12345

23456

34567

45678

56789

67890

从我对fgets()的理解是,当它到达文件的末尾时,它将返回null。因此,在读取第一个文件后,第一个while循环将停止,然后转到第二个while循环。

4 个答案:

答案 0 :(得分:2)

您将文件名作为命令行参数传递,但未在源代码中使用。请找到以下代码以便更好地理解。

并将代码作为./main id.txt name.txt

运行

argv[1]argv[2]分别包含id.txt和name.txt。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 10

int main(int argc, const char *argv[])
{
    char id[MAX];
    char name[MAX];
    FILE *fp1;
    FILE *fp2;
    if(argc==3)
    {
        fp1 = fopen(argv[1],"r");
        fp2 = fopen(argv[2],"r");
        if((fp1==NULL)||(fp2==NULL))
        {
            printf("one of the file is not openend");
        }
        while(fgets(id, sizeof id, fp1) != NULL)  
        {
            printf("ID: %s\n",id);
        }

        while(fgets(name, sizeof name, fp2) != NULL)
        {
            printf("Name: %s\n",name);
        }
    }
    else
    {
        printf("Please check command line arguments");
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

答案 1 :(得分:1)

您可以使用file pointers打开这两个文件,然后阅读它们。在命令行中获取文件名,然后执行此操作 -

 if(argc!=3){                     //check for incorrect command line arguments
       printf("Not enough arguments");
       return -1;
 }
 FILE *fp1,*fp2; 
 fp1=fopen(argv[1],"r");             //opening file in read mode
 if(fp1==NULL)                       //check return of fopen    
 {
   printf("Cannot open file %s",argv[1]);
 }
 fp2=fopen(argv[2],"r");
 if(fp2==NULL)                       //similarly check for second file
 {
   printf("Cannot open file %s",argv[2]);
 }

所以while loop中的语句应该从不是来自stdin的文件中读取。重写它们 -

while(fgets(id, sizeof id,fp1)!=NULL){
...
}
while(fgets(id, sizeof id,fp2)!=NULL){
...
}

还要记住最后关闭文件 -

fclose(fp1);
fclose(fp2);

答案 2 :(得分:0)

我认为最适合您的目的不是使用stdin,而是从命令行读取两个文件名:

命令行将是这个

./main id.txt name.txt    

计划(为简单起见,未进行任何错误检查):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 10
#define MAXLINELENGTH 100

int main(int argc, const char *argv[])
{
  if (argc != 3)
  {
    fprintf(stderr, "incorrect arguments");
    exit(1);
  }

  FILE *input;  
  char id[MAX];
  char name[MAX];

  input = fopen(argv[1], "r");  // argv[1] points to "id.txt"
  while(fgets(id, sizeof id , input) != NULL)  
  {
      printf("ID: %s\n",id);
  }
  fclose(input);

  input = fopen(argv[2], "r");  // argv[2] points to "name.txt"
  while(fgets(name, sizeof name , input) != NULL)  
  {
      printf("Name: %s\n",name);
  }
  fclose(input);

  return 0;
}

答案 3 :(得分:0)

检查代码以了解您的操作方法。你需要2个文件指针,2个不同的文件。如果你想“硬编码”它,将argv [1]和argv [2]更改为特定位置

FILE *fp1;
FILE *fp2;

fp1 = fopen(argv[1],"r");
fp2 = fopen(argv[2],"r");

fclose(fp1);
fclose(fp2);