为什么所有内容都被读为0?
int width = 5;
int height = 5;
int someTile = 1;
char buff[128];
ifstream file("test.txt", ios::in|ios::binary);
if(file.is_open())
{
cout << "open";
}
file.read(buff, sizeof(int));
width = atoi(buff);
file.read(buff, sizeof(int));
height = atoi(buff);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
file.read(buff, sizeof(int));
someTile = atoi(buff);
cout << someTile;
}
}
我的文件格式代码是用C#编写的,如下所示:
FileStream stream = new FileStream("test.txt", FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
// write a line of text to the file
writer.Write(15);
writer.Write(5);
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 5; j++)
{
writer.Write(1);
}
}
// close the stream
writer.Close();
答案 0 :(得分:1)
在不知道test.txt的内容的情况下,很难准确地说出来,但看起来你反复在字符缓冲区/字符串中读取4个字节(大多数平台上的int的大小),然后尝试将其转换为变成一个数字。除非您的文件完全由四个以空字符结尾的字节块构成,否则我不希望这样做。
更新:好的,看看你的文件格式你没有写字符串,你正在写一些内容。因此,我希望您能够直接阅读您的号码,而无需atoi
。
例如:
int value;
file.read((char*)&value, sizeof(int));
value
现在应该包含文件中的数字。要转换整个示例,您需要查找以下内容:
int width = 5;
int height = 5;
int someTile = 1;
ifstream file("test.txt", ios::in|ios::binary);
if(file.is_open())
{
cout << "open";
file.read(reinterpret_cast<char*>(&width), sizeof(int));
file.read(reinterpret_cast<char*>(&height), sizeof(int));
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
file.read(reinterpret_cast<char*>(&someTime), sizeof(int));
cout << someTile;
}
}
}
答案 1 :(得分:0)
atoi
将NUL终止的字符串转换为整数 - 您正在从文件中读取四个字节(它处于二进制模式) - 这可能不正确..
例如,一个有效的字符串(用于atoi
可以工作,“1234” - 注意:NUL终止),但是这个字节表示是0x31 0x32 0x33 0x34(注意NUL终止,因为你只读了因此,atoi
可以做任何事情。这个文件的格式是什么?如果它确实是字节表示,则数字1234看起来像(取决于字节顺序),0x00 0x00 0x04 0xD2,正确读取此int
的方法是逐字节移位。
那么,大问题 - 格式是什么?