fread()二进制模式在c ++

时间:2015-10-22 10:38:51

标签: c++ io

在使用c ++进行编码时,我遇到了fread()函数的问题。 目标是以二进制模式打开文件以进行写入: fopen_s(&filename,filelocation,"wb");,使用fwrite(&buffer,size_of_read,count,filename)写一个字符串和一个int,然后将数据读回其他变量(请注意,这可能看起来很愚蠢,然后从同一个文件中读取数据相同的程序,但这仅用于测试目的,因为我正在研究的项目严格基于加密,这是其中一个模块)...

这是我的代码:

int x = 1;                              // this is piece of data to write to the file
FILE *src;                              // the file variable that I am using
string text = "byebye";                 // this happens to be the piece of data
src = fopen("F:\\_log.log", "wb");      // open file in binary write mode
fwrite(&text, 1, 7, src);               // that's 7 because of 6 characters plus '\0'
fwrite(&x, 4, 1, src);                  // 4 bytes for int ---> writing x=1 to file
text.clear();                           // for verification purpose
fclose(src);
src = fopen("F:\\_log.log", "rb");
int y = 0;                              // this is the int that will contain read data
string read;                            // string that contains read data
fread(&read, 1, 7, src);                // read the data and store in read
fread(&y, 4, 1, src);                   // read the stored int into y
cout << "string is : " << read << "\nNumber is : " << y << endl;

上述程序的输出似乎对整数是正确的,但对于字符串则不正确......

string is : 
Number is : 1

Number is : 1语句清除第一个y为零,但文件中的数据已成功读取并存储在y中,然后转为1

但是,如果已正确读取整数,那么为什么不是字符串read 此外,textread似乎有同步,因为如果我将命令text.clear();更改为text="higuys";,则输出为:

string is : higuys
Number is : 1

我该如何解决这个问题? (完全无法理解该代码中正在处理的世界...)

其他信息(虽然可能没什么好处):

操作系统:Windows 10

IDE:codeblocks(也尝试使用visual studio)

编译器:GNU GCC

调试器:GDB

我尝试使用perror();检查是否有任何错误以及cout<<fread(&read,1,7,src)<<endl;之类的技巧来检查读取的字节数,但一切正常。请帮帮我这个......

编辑:

好的,我尝试使用char而不是string的数组,它确实有效! 但有一件事情还不清楚,那就是:为什么两个字符串textread同步?

1 个答案:

答案 0 :(得分:1)

您需要更改

string read;

char read[7];

string是一个类而不是缓冲区,所以你不能给出一个字符串对象的地址。

如果程序不仅仅是一个固定的7字节字符串而且不仅仅是C(你将问题标记为C ++),那么你应该考虑使用ifstream / ofstream和string以及使用运算符写入/读取&lt;&lt;和&gt;&gt;。