基本上,我试图读取一个文件,看看是否有任何行与我创建的子进程中的给定字符串匹配。然后将答案传送给打印出来的父进程。我的问题是,只有输入我的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以外的任何内容都不会给出正确的结果。父母打印后,我还有两个额外的字符。 我认为我做错了什么以及它为什么没有按预期工作?
答案 0 :(得分:1)
Fgets返回你的行中的endtrail caracter,这意味着你实际上是在比较aaabs
到aaabs\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'
,从清单中清除缓冲区。