在C中的子进程中读取文件

时间:2014-10-19 14:37:40

标签: c file process pipe fork

基本上,我试图读取一个文件,看看是否有任何行与我创建的子进程中的给定字符串匹配。然后将答案传送给打印出来的父进程。我的问题是,只有输入我的txt文件中的最后一行,我的代码才有效。报告的任何其他行都不存在于文件中。

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>

void Login()
{
char name[20];
int pfd[2];
pid_t pid;

pipe(pfd);

if((pid=fork()) == -1)
{
 exit(1);
}

if (pid==0)
{
 close(pfd[0]);
 FILE *fp = fopen("loginuser.txt", "r");
 printf("name:");
 scanf("%s", name);
 int ok = 0;
 if (fp!=NULL)
{
 char line[20];
 while (fgets(line,20,fp) !=NULL)
{
 if (strcmp(name,line)==0) ok = 1;
}
 fclose(fp);
}
 char s1[]="logged in!";
 char s2[]="Not found!";
 if(ok==1) write (pfd[1],s1,strlen(s1));
 else write(pfd[1],s2,strlen(s2));
 exit(0);
}
else
{ 
 close(pfd[1]);
 int n;
 char reada[20];
 n=read (pfd[0],reada,sizeof(reada));
 printf("%s",reada);
}
}

int main (int argc, char *argv[])
{
 Login();
 return 0;
}

loginuser.txt

aaabs
fas
ttt
aloo

在这种情况下,输入aloo以外的任何内容都不会给出正确的结果。父母打印后,我还有两个额外的字符。 我认为我做错了什么以及它为什么没有按预期工作?

1 个答案:

答案 0 :(得分:1)

Fgets返回你的行中的endtrail caracter,这意味着你实际上是在比较aaabsaaabs\n,因此strcmp失败了。 如果你这样做:

      while (fgets(line,20,fp) !=NULL)
        {
          size_t i = strlen(line) - 1;
          if (line[i] == '\n')
            line[i] = '\0';

          if (strcmp(name,line)==0)ok = 1;
        }

它会删除每个' \ n '而不是'\0',从清单中清除缓冲区。