我在获取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)
作为其第三个参数。