【发布时间】:2017-02-03 18:26:23
【问题描述】:
我正在尝试编写一个读取二进制文件并将其转换为数据类型的 C 程序。我正在生成一个带有 head 命令head -c 40000 /dev/urandom > data40.bin 的二进制文件。该程序适用于数据类型 int 和 char,但适用于 double。这是程序的代码。
void double_funct(int readFrom, int writeTo){
double buffer[150];
int a = read(readFrom,buffer,sizeof(double));
while(a!=0){
int size = 1;
int c=0;
for(c=0;c<size;c++){
char temp[100];
int x = snprintf(temp,100,"%f ", buffer[c]);
write(writeTo, temp, x);
}
a = read(readFrom,buffer,sizeof(double));
}
}
这是有效的 char 函数
void char_funct(int readFrom, int writeTo){
char buffer[150];
int a = read(readFrom,buffer,sizeof(char));
while(a!=0){
int size = 1;
int c=0;
for(c=0;c<size;c++){
char temp[100]=" ";
snprintf(temp,100,"%d ", buffer[c]);
write(writeTo, temp, strlen(temp));
}
a = read(readFrom,buffer,sizeof(char));
}
}
问题是使用 char 我需要使用 wc -w file 得到 40000 个单词,然后我得到了它们。现在使用 double 我得到随机数量的单词,但理论上我应该从 40000 字节的数据中得到 5000,但我得到 4000 到 15000 之间的随机数量,对于 char 我得到 40000,就像一个字符应该有 1 个字节一样。
我不知道有什么问题,同样的代码适用于 int,我从 40000 个字节的数据中得到 10000 个字。
【问题讨论】:
-
假设
read()读取请求的全部字节数是不安全的。必须使用返回值来确定实际读取了多少字节。 -
此外,如果发生错误,
read()将返回-1。您不考虑这种可能性,如果确实发生错误,您将处理谁知道什么数据。 -
这一行:
int x = snprintf(temp,100,"%f ", buffer[c]);从缓冲区中取出一个字符并尝试将其转换为浮点数。您可能想要检查返回值x,它告诉您有多少写入缓冲区。但是,这肯定不是你想要做的。 -
此外,
write()在传输的字节数方面与read()具有相似的特征,但实际上这对于本地文件来说很少出现问题。 -
@bruceg 在该版本中,缓冲区是
double数组,而不是其他版本中的char数组。
标签: c file file-io binary-data