我试图理解偶然发现的一些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
的内容时,我接近了我的预期,这是一堆垃圾,因为它只是打印从内存中随机抽取事物。
所以,确实有两个问题。
在不增加&c
的地址的情况下,如何正确写入outputFile.txt
的{{1}}?
由于c
在每个字符后添加了所有垃圾,我该如何打印文件中的各个字符而没有所有垃圾?
答案 0 :(得分:2)
确定两件事。
(1)char c
不需要增加,因为它就像对read
fn的输出一样。
(2)read
和write
fn自动增加它们各自的文件描述符。
文件描述符(fd_to_read
,fd_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。祝你好运。