【问题标题】:C programming: write() issuesC 编程:write() 问题
【发布时间】:2011-05-24 08:36:52
【问题描述】:

我需要将数组的内容写入文件。假设我生成随机数并将它们放入一个数组中。如何将这些值复制到输出文件中?

[... previous code/declarations ...]

file = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU|S_IWGRP|S_IWOTH);
buffer = (double *) calloc(d, sizeof(double));
for (i = 0; i < d; i++)
{
    double div = (double) (RAND_MAX/0.333);
    double r = rand()/div;
    (*(buffer+i)) = r;
}
write(file, buffer, sizeof(double));

[ ... ]

如果我尝试读取文件,我看到的只是内存垃圾,屏幕上到处都是无意义的字符。谁能帮我弄清楚我做错了什么?

【问题讨论】:

  • 当您说“读取文件”时,您的意思是使用 cat 吗?如果您使用 read 或 fread 阅读它们,您会看到这些值是完全合理的(尽管是随机的)值。如果您想从终端查看内容,请尝试使用 xxd 而不是 cat。

标签: c system-calls


【解决方案1】:

write 调用用于将内存块写入文件,如果您稍后尝试仅输出文件,这将看起来像是垃圾。这是因为它们很可能是 IEEE754 二进制表示。

如果您想要数字的文本表示,请使用以下内容:

fh = fopen (filename, "w");
for (i = 0; i < d; i++)
    fprintf (fh, "%f\n", buffer[i]);
fclose (fh);

【讨论】:

  • 垃圾或根本不可见,取决于文本查看器和首先出现的随机数。
【解决方案2】:

您正在将随机二进制值写入文件。当您读取文件时,您会看到随机二进制值,被解释为字符。问题出在哪里?

【讨论】:

  • 其实我没看到。如果我在输出文件上执行 cat 我会得到奇怪的字符,当我尝试从文件中读取时,为了在屏幕上打印值,什么都不会显示。
  • 那些“奇怪的字符”是随机二进制值的文本表示。
  • @haunted85,尼尔误解了你想要的。请参阅 paxdiablos 的回答。
【解决方案3】:

至少这部分是错的:

write(file, buffer, sizeof(double));

您只写入一个值,而不是整个数组。将大小乘以 d(这似乎是数组中元素的数量)。

【讨论】:

  • 我怎样才能确保将我所有的元素都写入文件,增加大小是否足够?我不需要循环吗?
【解决方案4】:

你为什么放

double div = (double) (RAND_MAX/0.333);

在循环内部?

【讨论】:

  • 你是对的,我不应该。这是一个错误。我没有过多关注算法本身,我试图弄清楚 write() 和 read() 是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2010-10-18
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
相关资源
最近更新 更多