为什么这个循环不连续打印相同的值?

Why does this loop not print the same value continuously?

我试图理解我偶然发现的一些 C 代码。作为记录,除了我添加的打印行之外,代码完全按照预期的方式执行。它从 inputFile.txt 中获取所有内容,并将 J 替换为 X,并将其写入 outputFile.txt.

int main(void) {
    int fd_to_read = open("inputFile.txt", O_RDONLY);
    int fd_to_write = open("outputFile.txt", O_WRONLY | O_CREAT);

    char c;
    int bytes;
    while ((bytes = read(fd_to_read, &c, sizeof(c))) > 0) {
        if (c == 'J') {
            c = 'X';
        }
        write(fd_to_write, &c, sizeof(c));
        //I added this and it doesn't work.
        printf(&c);
    }
    close(fd_to_read);
}

当我第一次看到这个时,我希望 while 循环一遍又一遍地打印文件中的第一个字符。我知道 read() 函数将一直执行到 >0,但我假设为了让它在文件中改变位置,c 指向的内存地址必须增加一些东西,可能是 sizeof(c),但似乎没有任何增加,它只是移动到文件中的下一个字母。我的下一个假设是 read() 自行处理,但是当我去打印 &c 的内容时,我接近我的预期,这是一大堆垃圾,因为它只是在打印本质上是内存中的随机事物。

那么,真的有两个问题。

  1. 写入outputFile.txt&c如何正确写入而不增加c的地址?

  2. 由于 print(&c) 在每个字符后添加了所有垃圾,我如何只打印文件中的单个字符而没有所有垃圾?

好的两件事。

(1) char c 不需要递增,因为它的作用类似于 outputread fn。

(2) readwrite fn 自动递增它们各自的文件描述符。

文件描述符(fd_to_readfd_to_write)表示文件中的位置,而不是 char c

在手册页中阅读相关信息: https://linux.die.net/man/3/read https://linux.die.net/man/3/write

char c; ... printf(&c); 是 UB,但我怀疑 OP 知道这一点。

printf() 的第一个参数必须是指向 字符串 的指针。 &c 不是指向 字符串 的指针。

OP希望获得有利的UB。祝你好运。