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

C 为什么这个循环不连续打印相同的值?,c,file,while-loop,stdio,C,File,While Loop,Stdio,我试图理解一些我偶然发现的C代码。作为记录,除了我添加的打印行之外,代码完全按照它应该做的做。它从inputFile.txt获取所有内容,用X替换J,并将其写入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; i

我试图理解一些我偶然发现的C代码。作为记录,除了我添加的打印行之外,代码完全按照它应该做的做。它从
inputFile.txt
获取所有内容,用X替换J,并将其写入
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()

所以,有两个问题

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

  • 既然
    print(&c)
    在每个字符之后添加了所有垃圾,那么我如何从文件中只打印单个字符而不打印所有垃圾呢

  • 好的,两件事

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

    (2)
    read
    write
    fn会自动增加各自的文件描述符

    文件描述符(
    fd_to_read
    fd_to_write
    )表示文件中的一个位置,而不是
    char c

    请在手册页中阅读相关内容: 好的,有两件事

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

    (2)
    read
    write
    fn会自动增加各自的文件描述符

    文件描述符(
    fd_to_read
    fd_to_write
    )表示文件中的一个位置,而不是
    char c

    请在手册页中阅读相关内容:
    charc。。。printf&c是UB,但我怀疑OP知道这一点

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

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

    charc。。。printf&c是UB,但我怀疑OP知道这一点

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


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

    1。它不需要递增。字节被写入
    c
    ,这是一个缓冲区。然后将缓冲区内容写入
    fd\u以写入
    2<代码>printf(“%c”,c)
    在每个循环过程中,读取单个字符,如果是“J”,则替换它,然后将其写入输出文件。始终使用相同的变量“c”。正如@mangusta已经提到的,您应该更正printf语句以在stdout中输出这个变量。否则,您将使用单字符变量“c”作为格式字符串,该字符串不会以空字节结尾,因此会导致未定义的行为。在您的情况下,这会导致看到垃圾。它不需要递增。字节被写入
    c
    ,这是一个缓冲区。然后将缓冲区内容写入
    fd\u以写入
    2<代码>printf(“%c”,c)
    在每个循环过程中,读取单个字符,如果是“J”,则替换它,然后将其写入输出文件。始终使用相同的变量“c”。正如@mangusta已经提到的,您应该更正printf语句以在stdout中输出这个变量。否则,您将使用单字符变量“c”作为格式字符串,该字符串不会以空字节结尾,因此会导致未定义的行为。在您的情况下,这会导致看到垃圾。