2012-04-03 131 views
0

作为赋值的一部分,我需要从二进制文件读取数据,该文件由数据的数据类型int,char组成。这个二进制文件分成96个字节的记录。我正试图将这96个字节读入一个char缓冲区,然后根据我拥有的信息尝试分割它们。但是当我尝试从缓冲区中获取int值时,我什么也没得到。你能帮我吗?C++文件操作

#include<iostream> 
#include<fstream> 
#include<cstdio> 

using namespace std; 

int main() 
{ 
    char buffer[100]; 
    char *p; 
    char temp[10]; 
    int val; 
    fstream ifs,ofs; 
    ifs.open("write.bin",ios::binary); 
    if(ifs.read(buffer,96)) 
    { 
     cout << "READ" << endl; 
    }  
    p = buffer; 
    memcpy(temp,buffer,4); 
    cout << temp << endl; 
    val = atoi(temp); 
    cout << val << endl; 
} 

我用strncpy也很到位的memcpyval的输出为0,temp的输出为空。

+9

如果您向我们显示您遇到问题的代码,我们可能会提供帮助。 – 2012-04-03 13:40:32

+2

难道你不会忘记'ifs.open(...)'中的'ios :: in'标志吗?尝试'做ifs.seekg(0);'在调用'ifs.read(...)'之前。 – vissi2 2012-04-03 14:17:53

+0

你的记录结构如何?看起来,你正在尝试读取字符串,其中的数据可能是一些二进制表示。 – Matthias 2012-04-03 15:19:58

回答

0

atoi将字符串(char数组)转换为整数。所以像"42"这样的东西会返回整数42。你的问题被写入的方式,听起来像整数只是存储在文本文件中的二进制文件。

缓冲区指针的一个简单的强制转换为所需的类型加一个反引用应该做的:

/* read 96 bytes into char array buffer */ 
uint32_t your_number = *(uint32_t*)buffer; 
cout << your_number << endl; 

如果你想使用memcpy,没有必要复制到一个字符数组,可以直接复制到整数地址:

uint32_t your_number; 
memcpy(&your_number, buffer, 4); 
cout << your_number << endl; 

带滑动C(不是C++),这将是:

uint32_t your_number; 
FILE *f = fopen("write.bin", "r"); 
fread(&your_number, sizeof(uint32_t), 1, f); /* uint32's size is 4 bytes */ 
fclose(f); 
printf("%d\n", your_number); 

我选择uint32_t作为数据类型,因为它保证有32位/ 4字节 - 在一些平台/编译器上,它可能具有不同的大小。

0

与C风格功能不同,read不返回读取的数字或字节,而是返回istream&。所以要检查结果,请在ifs.read()之后致电ifs.gcount()

+0

这应该是一个评论,因为它没有本身就解决了他的问题 – 2012-04-03 14:37:12

+0

恩,可能是,我在我的电脑上用gcc检查了程序https://gist.github.com/2293977,得到了非空的输出,问题可能在数据中。 – vissi2 2012-04-03 17:40:24