c - 写入文件时出现 I/O 问题

标签 c io system-calls

我很难弄清楚为什么这段代码不能正常工作。我正在学习 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(如果您的实现具有该功能)、scanffgets)。

关于c - 写入文件时出现 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9239546/

相关文章:

java - 如何在阻塞模式 NIO 中实现超时?

Linux 系统调用上的 Java 断点

c - wait() 系统调用 - child 会忽略它吗?

c - 十六进制值等于负值

c - 在指针数组中放置一个区间

c - 如何在 C 中创建一个数组数组?

haskell - 使用 bang 模式时 IO monad 会变得严格吗?

c++ - sigqueue 可以与 pthreads 一起使用吗?

haskell - 如何创建一个 Haskell 函数将 IO String 转换为 IO [String]?

c - 如何 fork 一个 child 来替换已完成的 child ?