gpt4 book ai didi

c - while循环中的scanf无法输入任何内容

转载 作者:行者123 更新时间:2023-11-30 19:27:06 27 4
gpt4 key购买 nike

我使用的是 Linux 2.0.26 VM,从未遇到过此问题。

while 循环之所以有效,是因为我在其中添加了一个 printf 来测试它。

#include <stdio.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void main()
{
int i;

mknod("pipe.txt", S_IFIFO | 0666, 0);
for (i = 0; i < 2; i++) {
if (fork() == 0) {
if (i == 0)
to_pipe();
//else
// pipe_a_archivo();
}
}
wait(NULL);
unlink("pipe.txt");
}

void to_pipe()
{
int num, fdini;

fdini = open("pipe.txt", O_WRONLY);
do {
//printf("Test");
scanf("%d", &num);
write(fdini, &num, sizeof(int));
} while (num != 0);

close(fdini);
unlink("pipe.txt");
exit();
}

该程序应该从键盘获取数字并将其写入文件中。我的问题是,每当我从命令行执行程序时,什么也没有发生, scanf() 不起作用,因为它不允许我输入任何数字。我确信循环可以工作,因为如果取消注释 printf() 它就会打印在屏幕上。有帮助解决这个问题吗?

最佳答案

我认为您的大部分问题是由于您没有实现 pipe_a_archivo() 函数来从 FIFO 读取数据并将数据写入文件。当然,问题中的代码不是一个好的MCVE( Minimal, Complete, Verifiable Example )。除其他问题外,循环的第二次迭代没有任何操作。

此代码错误检查函数调用,并包含 pipe_a_archivo() 的合理实现,然后正常工作:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

static void to_pipe(void);
static void pipe_a_archivo(void);

#define FIFO_NAME "pipe.txt"
#define FILE_NAME "archive.txt"

int main(void)
{
if (mkfifo(FIFO_NAME, 0666) != 0)
{
fprintf(stderr, "failed to create FIFO '%s'\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
if (fork() == 0)
to_pipe();
if (fork() == 0)
pipe_a_archivo();
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
printf("PID %d exited with status 0x%.4X\n", corpse, status);
unlink("pipe.txt");
}

static void to_pipe(void)
{
int num, fdini;

fdini = open(FIFO_NAME, O_WRONLY);
do
{
printf("Enter a number: ");
fflush(stdout);
scanf("%d", &num);
write(fdini, &num, sizeof(int));
} while (num != 0);

close(fdini);
exit(0);
}

static void pipe_a_archivo(void)
{
int fd_in = open(FIFO_NAME, O_RDONLY);
if (fd_in < 0)
{
fprintf(stderr, "Failed to open FIFO '%s' for reading\n", FIFO_NAME);
exit(EXIT_FAILURE);
}

FILE *fp_out = fopen(FILE_NAME, "w");
if (fp_out == NULL)
{
fprintf(stderr, "Failed to open file '%s' for writing\n", FILE_NAME);
exit(EXIT_FAILURE);
}

int num;
while (read(fd_in, &num, sizeof(num)) == sizeof(num))
{
fprintf(fp_out, "%d\n", num);
}

close(fd_in);
fclose(fp_out);
exit(0);
}

我删除了 main() 中的循环,因为测试它所在的迭代然后调用适当函数的循环确实不是一个好的设计。此代码也仅在主程序中删除 FIFO,并且仅在两个子进程退出后才删除。

示例运行:

$ ./fifo29
Enter a number: 23
Enter a number: 34
Enter a number: 12931344
Enter a number: 0
PID 10939 exited with status 0x0000
PID 10940 exited with status 0x0000
$ cat archive.txt
23
34
12931344
0
$

关于c - while循环中的scanf无法输入任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094011/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com