这里的任务是:这是基本的C程序,必须包含两个进程。第一个程序在文件中写入60个随机数。需要写入的秒数必须读取文件并将偶数仅写入另一个新文件中。我有这段代码和需要将偶数写入文件的父进程,它无法正常工作。我的问题也与代码的结构有关,这是描述进程的最佳方法。

#include <stdio.h>
#include <fcntl.h>

int main() {
    int pid, fd, buf, i, fd2, buf2;
    pid = fork();

    switch (pid) {
    case 0: {
        printf("\n Child process is writing numbers. \n");
        fd = open("file.dat", O_RDWR | O_CREAT, 0644);

        for (i = 0; i < 60; i++) {
            buf = rand() % 20 - 10;
            printf("\n Writing number %d %d ", i + 1, buf);
            write(fd, &buf, sizeof(buf));
        }

        close(fd);
        break;
    }

    case -1: {
        printf("\n Fork error! \n");
    }

    default: {
        wait(pid);
        printf("\n Parent process is Copying numbers. \n");
        fd = open("file.dat", O_RDONLY);
        fd2 = open("file_output.dat", O_RDWR | O_CREAT, 0644);

        while (read(fd, &buf, sizeof(buf)) == sizeof(buf)) {
            if (buf & ~1)
                (buf2 = buf);
            write(fd2, &buf2, sizeof(buf2));
            printf("Writing number in file_output.dat %d \n", buf2);
        }

        close(fd2);
        close(fd);
    }
    }
    return 0;
}

最佳答案

您的条件是错误的:

    if (buf &~ 1) (buf2=buf);
    write(fd2, &buf2, sizeof(buf2));

您不管写出数字,但是如果是奇数(除了需要修复偶数/奇数测试),那么就不会更新buf2。如果第一个数字为奇数,则buf2未初始化。

你需要这个:
    if (buf % 2 != 0) continue;
    write(fd2, &buf, sizeof(buf));
    printf("Writing number in file_output.dat %d \n", buf);

请注意,这可能无法正确测试负偶数。您可以测试abs(buf) % 2 != 0。唯一可能无法处理的数字是INT_MIN

08-06 15:09