我无法通过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数组。
答案 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
作为第三个参数。