C编程:write()问题

C编程:write()问题,c,system-calls,C,System Calls,我需要将数组的内容写入文件。让我们假设我生成随机数并将它们放入一个数组中。如何将这些值复制到输出文件中 [... 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

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

[... 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));

[ ... ]
[…以前的代码/声明…]
文件=打开(文件名,O|u WRONLY | O|u CREAT | O|u TRUNC,S|u IRWXU | S|u IWGRP | S|IWOTH);
buffer=(double*)calloc(d,sizeof(double));
对于(i=0;i

如果我试图读取这些文件,我所看到的只是内存垃圾,屏幕上到处都是无意义的字符。谁能帮我找出我做错了什么吗?

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

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

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

fh = fopen (filename, "w");
for (i = 0; i < d; i++)
    fprintf (fh, "%f\n", buffer[i]);
fclose (fh);
fh=fopen(文件名,“w”);
对于(i=0;i
至少这部分是错误的:

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

为什么要将

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

在循环内部?

实际上我没有看到它们。如果我对输出文件执行cat,我会得到奇怪的字符,当我试图读取文件时,为了在屏幕上打印值,什么也不显示。这些“奇怪的字符”是随机二进制值的文本表示。@Happeted85,Neil误解了你的意思。请参阅paxdiablos的答案。垃圾或根本不可见,这取决于文本查看器以及最先出现的随机数。当你说“读取文件”时,你是指使用cat吗?如果您使用read或fread读取它们,您将看到这些值是完全合理的(尽管是随机的)值。如果您想从终端查看内容,请尝试使用xxd而不是cat。您是对的,我不应该这样做。这是一个错误。我对算法本身没有太多的关注,我只是想弄清楚write()和read()是如何工作的。我如何确保自己将所有元素都写到文件中,增加大小是否足够?我不需要一个环吗?