【问题标题】:open() and write() functions in CC 中的 open() 和 write() 函数
【发布时间】:2014-03-27 22:52:37
【问题描述】:

我正在尝试在 .txt 文件中写入变量 environ 的内容。

int archivo = open(argv[1], "rw");
int i=0;
while(environ[i]!=NULL){
    write(archivo, environ[i], 1024);
    i++;
}

文件已创建,但未添加任何内容。有谁知道为什么?

【问题讨论】:

  • 你混淆了open(const char *pathname, int flags)fopen(const char *path, const char *mode)
  • 是的,但问题是我想使用 write 命令来完成
  • 你是如何声明environ的?请注意,无论environ[i] 指向的字符串有多长,您都告诉write 始终写入1024 个字节。这肯定会引起人们的注意。
  • 是的,但您仍然对open()fopen() 感到困惑。 (提示:这些函数中只有一个使用字符串来定义打开模式)。

标签: c file-io posix system-calls


【解决方案1】:
  1. 咨询man 2 open 以获得open 的正确参数。应该是:

    open(argv[1], O_WRONLY | O_CREAT | O_TRUNC);
    
  2. 你应该只写你实际拥有的广告:

    write(archivo, environ[i], strlen(environ[i]));
    
  3. 你必须确保你写的东西确实离开了缓冲区:

    size_t string_length = strlen(environ[i]);
    size_t wrote = 0;
    while (wrote < string_length) {
        size_t bytes_wrote = write(archivo, environ[i] + wrote, string_length - wrote);
        if (bytes_wrote >= 0)
            wrote += bytes_wrote;
        else {
            perror("write");
            abort();
        }
    }
    

    write 不保证您提交的所有内容都会被写入。

理想情况下,您应该寻找对程序员更友好的stdio 调用fopenfwrite

FILE * fp = fopen(argv[1], "w");

// loop i
if (!fwrite(environ[i], strlen(environ[i]), 1, fp)) {
    perror("fwrite");
    abort();
}

【讨论】:

  • 其实不应该是strlen(environ[i])+1吗? (或者在每次写入之后使用某种分隔符?)
  • @ElchononEdelson 除非您正在编写二进制文件,否则将空终止符也写出来是个坏主意。不过,分隔符不是一个坏主意:)。这仍然不是问题的一部分。
  • 没错,这不是问题的一部分,但您仍然需要其中一个。
  • 如果errno == EINTR,你应该重试write
  • @SergeyL.:添加一个新行可能是有意义的。
【解决方案2】:

我相信您必须更改打开文件的标志。 "rw" 不是用于 open(),而是用于 fopen()。

open(argv[1], O_WRONLY);

我认为是使用 open 写入文件的最低要求

编辑:我找到了一个链接http://pubs.opengroup.org/onlinepubs/009696899/functions/open.html

【讨论】:

  • 有趣。不知何故,谷歌给了我一个过时的链接。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多