C 为什么这个循环不连续打印相同的值?
我试图理解一些我偶然发现的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
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”作为格式字符串,该字符串不会以空字节结尾,因此会导致未定义的行为。在您的情况下,这会导致看到垃圾。