【发布时间】: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 的内容时,我接近了我的预期,这是一大堆垃圾,因为它只是从内存中打印随机的东西基本上。
所以,真的有两个问题。
写入
outputFile.txt的&c如何在不增加c地址的情况下正确写入?由于
print(&c)在每个字符后添加了所有垃圾,我如何只打印文件中的单个字符而没有所有垃圾?
【问题讨论】:
-
1.它不需要增加。字节被写入
c,这是一个缓冲区。然后将缓冲区内容写入fd_to_write2.printf("%c",c); -
在每个循环过程中,您读取单个字符,如果它是“J”则将其替换,然后将其写入输出文件。始终使用相同的变量“c”。正如@mangusta 已经提到的,您应该更正您的 printf 语句以在标准输出中输出此变量。否则,您将使用单个 char 变量 'c' 作为格式字符串,它不会以空字节终止,因此会导致未定义的行为。在您的情况下,这会导致看到垃圾。
标签: c file while-loop stdio