2010-01-28 55 views
0

我将文件的内容分配到字符串对象中。为了简单起见,该文件只有5个字节,其大小为1个整数加上另一个字节。 我想要做的是获取字符串对象的前四个字节,并以某种方式将它存储到程序有效的整数变量中。然后程序会对整数进行各种操作,改变它。 之后,我想将更改的整数存储回字符串对象的前四个字节。读取/写入字符串对象上的整数值

谁能告诉我我可以做到这一点?我宁愿坚持使用标准C++库专门用于此目的。预先感谢您的帮助。

+0

那是功课吗? – sbi 2010-01-28 20:17:20

+0

我甚至没有参加过编程课。感谢与问题相关的所有答复。 – kaykun 2010-01-28 20:20:18

+1

哦,我刚刚看到这个:你的意思是整数存储_binary_?那么我的回答是无稽之谈。我会删除它。 – sbi 2010-01-28 20:25:38

回答

2

下面的代码片段应该说明一些事情。谨防endian差异。玩它。尝试了解发生了什么。添加一些文件操作(二进制读取&写入)。真正理解如何做到这一点的唯一方法是尝试并创建一些测试。


#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char *argv[]) { 
    int a = 108554107; // some random number for example sake 

    char c[4];   // simulate std::string containing a binary int 
    *((int *) &c[0]) = a; // use casting to copy the data 

    // reassemble a into b, using indexed bytes from c 
    int b = 0; 
    b |= (c[3] & 0xff) << 24; 
    b |= (c[2] & 0xff) << 16; 
    b |= (c[1] & 0xff) << 8; 
    b |= c[0] & 0xff; 

    // show that all three are equivalent 
    cout << "a: " << a << " b: " << b 
     << " c: " << *((int *) &c[0]) << endl; 

    return 0; 
} 
+0

非常感谢。 *((int *)&c)正在按照我希望它将char序列转换为整数的方式工作。 – kaykun 2010-01-28 22:18:08

+0

请注意,将任何内存地址转换为较大的类型可能会导致cpu对齐错误。在x86处理器上可以,因为它们允许你这样做,但几乎所有其他处理器都会产生对齐错误。如果你希望你的代码是跨平台的,你可以使用memcpy而不是*(int *)。例如int i; memcpy(&i,c,sizeof(i)); – 2010-01-28 22:46:55

+0

感谢您的信息,我只是把它与memcpy一起工作。我从现在开始使用它。 – kaykun 2010-01-29 02:33:23

0

如果您从该文件读入std::string,则任何零字节都将表示字符串结束,因此您最终可能会得到一个比5字节短的字符串。看看here如何做二进制I/O与C++流。

+0

我可以验证我正在使用的字符串对象与文件的大小是否正确,即使是零字节也是如此。在你关联的网站上,关于读取数据的部分,它使用myFile.read(buffer,100); myFile是一个ifstream对象,缓冲区是一个char数组。我想读取前四个字节作为一个普通的int变量,而不是一个字符数组。 – kaykun 2010-01-28 20:35:11

+0

进一步阅读“读取/写入非字符数据”。只需读入你的int,不用中间字符串。 – 2010-01-28 20:49:05