在使用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
此外,text
和read
似乎有同步,因为如果我将命令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
的数组,它确实有效!
但有一件事情还不清楚,那就是:为什么两个字符串text
和read
同步?
答案 0 :(得分:1)
您需要更改
string read;
到
char read[7];
string是一个类而不是缓冲区,所以你不能给出一个字符串对象的地址。
如果程序不仅仅是一个固定的7字节字符串而且不仅仅是C(你将问题标记为C ++),那么你应该考虑使用ifstream / ofstream和string以及使用运算符写入/读取&lt;&lt;和&gt;&gt;。