为什么此循环不能连续打印相同的值?

时间:2019-09-28 05:20:21

标签: c file while-loop stdio

我试图理解偶然发现的一些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. 在不增加&c的地址的情况下,如何正确写入outputFile.txt的{​​{1}}?

  2. 由于c在每个字符后添加了所有垃圾,我该如何打印文件中的各个字符而没有所有垃圾?

2 个答案:

答案 0 :(得分:2)

确定两件事。

(1)char c不需要增加,因为它就像对read 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

答案 1 :(得分:0)

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

printf()的第一个arg必须是指向 string 的指针。 &c不是指向 string 的指针。

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