我很难弄清楚为什么这段代码不能正常工作。我正在学习 I/O 操作的基础知识,我必须想出一个 C 程序,该程序将标准输入给出的内容写入“log.txt”文件,并且当输入“停止”字时,程序必须停止.
所以我的代码是:
#include "main.h"
#define SIZE 1024
int main(int argc, char *argv[])
{
int fd;
int readBytes;
int writBytes;
char *buffer;
if ((fd = open("log.txt", O_WRONLY|O_APPEND)) < 0)
{
perror("open");
}
buffer = (char *) calloc (SIZE, sizeof(char));
while ((readBytes = read(0, buffer, SIZE) < SIZE)&&(strncmp(buffer, "stop", 4) != 0));
if ((writBytes = write(fd, buffer, SIZE)) < 0)
{
perror("write");
}
if ((close(fd)) < 0)
{
perror("close");
}
}
如果我输入:
this is just a text
stop
输出为
stop
is just a text
如果我输入多个句子:
this is just a text
this is more text
and text again
stop
这是记录的内容:
stop
ext again
xt
t
最重要的是,如果我尝试从 vim 或文本编辑器编辑 log.txt 文件,我可以看到“\00”。我猜\00 代表 1024 个可用字节中所有留空的字节,对吧?我怎样才能防止这种情况发生?
最佳答案
看起来你很期待
readBytes = read(0, buffer, SIZE) < SIZE)
以某种方式在缓冲区中积累东西。事实并非如此。随后的每次读取都会将读取到的内容放在缓冲区的开头,覆盖之前读取的内容。
您需要将 write
放在 while
block 中 - 每次读取一次写入,并且仅 write
与您一样多>read
,否则您将在日志文件中写入垃圾(来自 calloc
的零和/或上次读取的剩余内容)。
另请注意,虽然您的技术可能在大多数情况下适用于行缓冲输入流,但如果您从文件或管道重定向,则它不会执行您期望的操作。您应该使用格式化输入函数(例如 getline
(如果您的实现具有该功能)、scanf
或 fgets
)。
关于c - 写入文件时出现 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239546/