这里的任务是:这是基本的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
。