【问题标题】:Why does this loop not print the same value continuously?为什么这个循环不连续打印相同的值?
【发布时间】:2019-09-28 05:20:21
【问题描述】:

我正在尝试理解一些我偶然发现的 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.它不需要增加。字节被写入c,这是一个缓冲区。然后将缓冲区内容写入fd_to_write 2. printf("%c",c);
  • 在每个循环过程中,您读取单个字符,如果它是“J”则将其替换,然后将其写入输出文件。始终使用相同的变量“c”。正如@mangusta 已经提到的,您应该更正您的 printf 语句以在标准输出中输出此变量。否则,您将使用单个 char 变量 'c' 作为格式字符串,它不会以空字节终止,因此会导致未定义的行为。在您的情况下,这会导致看到垃圾。

标签: c file while-loop stdio


【解决方案1】:

好的,两件事。

(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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多