c-正在获取write()系统调用以写入文件



我在获取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数组。

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 
        ...

一般建议:仔细阅读函数的文档。

snprintf的每个调用都应该使用sizeof(buffer)而不是sizeof(int)。对write的每次调用都应将strlen(buf)作为其第三个参数。

相关内容

最新更新