c - 复制文本文件并将其粘贴到新文件 C 时遇到问题

标签 c unix

我在学校作业上遇到了麻烦,目前该代码适用于 child 获取文本并将其放入新的文本文件。 除父级外,文件创建成功但为空。

我的文本文件如下所示

1 text to be copied to child1.

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/

相关文章:

java - 当使用 StandardOpenOption.SYNC 打开底层 channel 时,我们是否必须刷新 MappedByteBuffer

Unix tcsh - 使用命令行参数 $1 与\! :1

linux - 关于 grep 命令

C 信号量和线程之间的 "barrier"

做指针事情时的 Const 类型限定符

c - 调试器变得奇怪?

C *运算符在数组赋值中的含义

当在 Unix 系统中给出完整的 Web 路径时,PHP move_uploaded_file 不上传图像

unix - 可以将mut i8转换为i32吗?

c - 警告 : format ‘%d’ expects argument of type ‘int’ , 但参数 2 的类型为 ‘long int’ [-Wformat=]