我在学校作业上遇到了麻烦,目前该代码适用于 child 获取文本并将其放入新的文本文件。 除父级外,文件创建成功但为空。
我的文本文件如下所示
1 text to be copied to child1.
block 引用>0 text to be copied to parent
我的代码如下
int main(){ int c1,c2,c3 ; FILE *fp1,*fpm, *fp2; char str1[100]; char str2[100]; fp1 = fopen("test.txt","r"); fpm = fopen("mainlog.txt","w"); fp2 = fopen("child1log.txt","w"); c1 = fork(); if(c1 == 0){ printf("child Process\n"); while ((fgets(str1,80,fp1))!=NULL){ if(str1[0]=='1'){ fputs(str1+1,fp2); } } } else{ printf("This is parent Process\n"); while ((fgets(str,80,fp1))!=NULL){ if(str[0]=='0'){ fputs(str+1,fpm); } } } return 0; }
感谢帮助。
最佳答案
fp1
底层的打开文件描述符指向一个打开文件描述(是的 - 这是 POSIX 术语;请参阅 open()
)。之后fork()
,每个进程都有自己的文件打开文件描述符,但它们共享打开文件描述。读取位置是打开文件描述的一个属性。
因此,两个进程之一首先读取,并且它也移动另一个进程的读取指针。由于第一个进程读取了文件中的所有数据,因此第二个进程立即获得 EOF。
您可以在fork()
之后打开文件进行读取;至少,这可能是避免麻烦的最简单方法。或者,进程可以在读取之前倒回。对于一个人来说,这将是一个空操作,但对于另一个人来说,这会产生影响。在这种情况下,您还可以在 fork 之前进行读取,这会用数据填充 fp1
的缓冲区,并且两个进程都会看到读取的内容。不过,这可能算作弊。
关于c - 复制文本文件并将其粘贴到新文件 C 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50226095/