获取write()系统调用以写入文件

时间:2014-11-02 09:03:06

标签: c system-calls

我无法通过write()系统调用来写入文件。到目前为止,我设法只将乱码打印到一个据说是二进制文件的文件中。我知道我们必须以某种方式预先格式化write()。

如何实际使用write()来创建/写入文本文件?

void writeNumbers(int array[], int size, char* fname, int hexFlag) {

    int fp;
    int i;
    char buf[512];


    fp = open(fname, O_WRONLY | O_CREAT | O_APPEND);         


    if (fp < 0) {
            close(fp);
            char msg[] = "Cannot write";
            write(STDOUT_FILENO, msg, sizeof(msg) - 1);
            exit(1);
    }


    if (hexFlag == 0) {
            for (i = 0; i < size; i++) { 
                    snprintf(buf, sizeof(int), "%d ", array[i]);
                    write(fp, buf, sizeof(buf));
            }
    } else {
            for (i = 0; i < size; i++) { 
                    snprintf(buf, sizeof(int), "%x ", array[i]);
                    write(fp, buf, sizeof(int));
            }
    }
    write(fp, "message", sizeof(buf));


    close(fp);
}

这里我试图以十六进制或十进制格式打印一个int数组。

2 个答案:

答案 0 :(得分:2)

snprintf()返回打印到传递的缓冲区中的字符数。它还需要将最大字符数作为第二个参数打印到缓冲区,通常是缓冲区的大小,但也可能很少。

您想要准确写出snprintf()返回的字符数。

        if (hexFlag == 0) {
            for (i = 0; i < size; i++) { 
                int result = snprintf(buf, sizeof(buf), "%d ", array[i]);
                if (0 > result)
                {
                  write(STDERR_FILENO, "snprintf() failed.\n", strlen("snprintf() failed.\n"));
                }
                else
                {
                  write(fp, buf, result);
                }
            }
        }
        else 
        ...

作为一般建议:仔细阅读功能的文档。

答案 1 :(得分:2)

对[{1}}的每次调用都应采用snprintf代替sizeof(buffer)。每次调用sizeof(int)都应将write作为第三个参数。