为什么这个循环不连续打印相同的值?
Why does this loop not print the same value continuously?
我试图理解我偶然发现的一些 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) char c
不需要递增,因为它的作用类似于 output 到 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
char c; ... printf(&c);
是 UB,但我怀疑 OP 知道这一点。
printf()
的第一个参数必须是指向 字符串 的指针。 &c
不是指向 字符串 的指针。
OP希望获得有利的UB。祝你好运。
我试图理解我偶然发现的一些 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) char c
不需要递增,因为它的作用类似于 output 到 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
char c; ... printf(&c);
是 UB,但我怀疑 OP 知道这一点。
printf()
的第一个参数必须是指向 字符串 的指针。 &c
不是指向 字符串 的指针。
OP希望获得有利的UB。祝你好运。