在 C++ 中使用 reinterpret_cast<char*> 读取数据失败
Failed to read data using reinterpret_cast<char*> in C++
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
// write file
string file_name = "random_fstream.dat";
ofstream file(file_name, ios_base::out | ios_base::binary);
if (!file) {return EXIT_FAILURE;}
int r = 2;
int c = 3;
file.write(reinterpret_cast<char*>(&r),sizeof(r));
file.write(reinterpret_cast<char*>(&c),sizeof(c));
//------------------------------------------------
// read file
ifstream in(file_name, ios_base::in | ios_base::binary);
if (!in) {return EXIT_FAILURE;}
int x = 0;
int y = 0;
in.read(reinterpret_cast<char*>(&x),sizeof(x));
in.read(reinterpret_cast<char*>(&y),sizeof(y));
cout << x << y << endl;
return 0;
}
我正在尝试练习在 C++ 中写入和读取文件。第一步是以二进制形式将 int 值 2 和 3 写入文件。第二步是从该文件中读取两个数字。
然后我得到 x 和 y 的值都等于 0,但我希望收到 x=2
和 y=3
。我哪里做错了?
正如评论中指出的那样,您至少有两个错误:
第一个问题是你的阅读:你的阅读都使用 x
的地址和 y
的大小,我确定这只是一个错字。
其次,您必须 close()
您打开的用于写入的文件(或者至少 flush 您的写入 (sync()
),然后再读取相同的文件数据,但这需要非常谨慎和特殊规则。)无论如何,您需要关闭文件,方法是让句柄(在本例中为 file
)超出范围并调用其析构函数,或自己打电话给 file.close()
(在写入之后。)
为防止出现此问题,您通常必须在每次执行任何操作时检查错误I/O。为此,您可以像布尔变量一样使用文件句柄的名称,例如:
in.read(reinterpret_cast<char*>(&x),sizeof(x));
if (!in)
cerr << "First read failed." << endl;
in.read(reinterpret_cast<char*>(&y),sizeof(y));
if (!in)
cout << "Second read failed." << endl;
我想知道到底发生了什么,class std::istream
显式转换为 bool
即 returns 最后一个操作是否成功(或者流是否处于 readable/good 条件。)还有许多为 C++ 流(输入和输出)定义的成员函数,可帮助您检查错误、流的结尾等., 例如bad()
、good()
、fail()
、eof()
等
再次提醒,任何 I/O 操作都可能因各种原因随时失败,因此请检查其状态!
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
// write file
string file_name = "random_fstream.dat";
ofstream file(file_name, ios_base::out | ios_base::binary);
if (!file) {return EXIT_FAILURE;}
int r = 2;
int c = 3;
file.write(reinterpret_cast<char*>(&r),sizeof(r));
file.write(reinterpret_cast<char*>(&c),sizeof(c));
//------------------------------------------------
// read file
ifstream in(file_name, ios_base::in | ios_base::binary);
if (!in) {return EXIT_FAILURE;}
int x = 0;
int y = 0;
in.read(reinterpret_cast<char*>(&x),sizeof(x));
in.read(reinterpret_cast<char*>(&y),sizeof(y));
cout << x << y << endl;
return 0;
}
我正在尝试练习在 C++ 中写入和读取文件。第一步是以二进制形式将 int 值 2 和 3 写入文件。第二步是从该文件中读取两个数字。
然后我得到 x 和 y 的值都等于 0,但我希望收到 x=2
和 y=3
。我哪里做错了?
正如评论中指出的那样,您至少有两个错误:
第一个问题是你的阅读:你的阅读都使用 x
的地址和 y
的大小,我确定这只是一个错字。
其次,您必须 close()
您打开的用于写入的文件(或者至少 flush 您的写入 (sync()
),然后再读取相同的文件数据,但这需要非常谨慎和特殊规则。)无论如何,您需要关闭文件,方法是让句柄(在本例中为 file
)超出范围并调用其析构函数,或自己打电话给 file.close()
(在写入之后。)
为防止出现此问题,您通常必须在每次执行任何操作时检查错误I/O。为此,您可以像布尔变量一样使用文件句柄的名称,例如:
in.read(reinterpret_cast<char*>(&x),sizeof(x));
if (!in)
cerr << "First read failed." << endl;
in.read(reinterpret_cast<char*>(&y),sizeof(y));
if (!in)
cout << "Second read failed." << endl;
我想知道到底发生了什么,class std::istream
显式转换为 bool
即 returns 最后一个操作是否成功(或者流是否处于 readable/good 条件。)还有许多为 C++ 流(输入和输出)定义的成员函数,可帮助您检查错误、流的结尾等., 例如bad()
、good()
、fail()
、eof()
等
再次提醒,任何 I/O 操作都可能因各种原因随时失败,因此请检查其状态!