C ++文件操作

时间:2012-04-03 13:39:06

标签: c++

作为赋值的一部分,我需要从包含intchar数据类型数据的二进制文件中读取数据。该二进制文件分为每个96字节的记录。我试图将这96个字节读入char缓冲区,然后根据我的信息尝试拆分它们。但是在尝试从缓冲区中获取int值时,我什么都没得到。你能帮帮我吗?

#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的输出为空。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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字节 - int可能在某些平台/编译器上具有不同的大小。