【问题标题】:Reading file in child process in C在C中的子进程中读取文件
【发布时间】:2014-10-19 14:37:40
【问题描述】:

所以基本上,我正在尝试读取文件并查看是否有任何行与我创建的子进程中的给定字符串匹配。然后将答案传输到打印出来的父进程。我的问题是我的代码只有在我输入 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 以外的任何内容都不会给出正确的结果。在父母打印一些东西后,我还有两个额外的字符。 知道我做错了什么以及为什么它没有按预期工作吗?

【问题讨论】:

  • 一个细节:代替while (fgets(line,20,fp) !=NULL)使用while (fgets(line,sizeof(line),fp) !=NULL)
  • 最初就是这样,但我进行了更改以尝试解决我的问题。使用它没有任何变化,问题仍然没有解决。

标签: c file process pipe fork


【解决方案1】:

Fgets 返回行中的 endtrail 字符,这意味着您实际上是在比较 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' 代替,从端点清除缓冲区。

【讨论】:

  • 很高兴我能帮助你@bf16
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多