C# C++;文件i/o错误?
为什么所有内容都被读取为0C# C++;文件i/o错误?,c#,c++,file,io,C#,C++,File,Io,为什么所有内容都被读取为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));
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;
}
}
int-width=5;
整数高度=5;
int-someTile=1;
字符buff[128];
ifstream文件(“test.txt”,ios::in | ios::binary);
if(file.is_open())
{
cout在不知道test.txt的内容的情况下,很难准确地说出来,但看起来您正在重复读取4个字节(大多数平台上的大小为int)除非你的文件是完全由以null结尾的四个字节块构成的,否则我不认为这会起作用
更新:好的,看看你的文件格式,你不是在写字符串,而是在写整数。因此,我希望你能够直接读入你的数字,而不需要atoi
例如:
int value;
file.read((char*)&value, sizeof(int));
value
现在应该包含文件中的数字。要转换整个示例,您需要以下内容:
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();
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;
}
}
}
int-width=5;
整数高度=5;
int-someTile=1;
ifstream文件(“test.txt”,ios::in | ios::binary);
if(file.is_open())
{
coutatoi
将以NUL结尾的字符串转换为整数-您正在从文件中读取四个字节(它处于二进制模式)-这可能不正确
例如,一个有效的字符串(对于atoi
来说可以是“1234”-注意:NUL终止),但是它的字节表示是0x31 0x32 0x33 0x34(注意,如果您只读取4个字节,NUL终止,那么,atoi
可以执行任何操作)。此文件的格式是什么?如果它真的是字节表示,则数字1234看起来像(取决于endianess),0x00 0x00 0x04 0xD2,正确读取此int
的方法是逐字节移位
所以,一个大问题-格式是什么?不要吹毛求疵,但您不需要ios::in和ifstream,它已经被定义为输入。如果文件打开失败,会发生什么情况,您仍然尝试读取数据。看起来您是以二进制模式打开文件,但随后以文本模式处理数据。为什么不以文本模式打开文件呢首先?我可能有一个更简单的解决方案,但因为我不确定,所以我发布了它。| 45 |错误:调用'std::basic_ifstream::read(int*,unsigned int')时没有匹配的函数。当我尝试时,仍然得到相同的错误。调用'std::basic_ifstream::read(int*,unsigned int)时没有匹配的函数“好的,看起来我需要为ifstream进行一些强制转换,但我没有意识到它只有char*方法。我更喜欢在IO中使用plainfopen
/fread
。看看这是否有效。注意:上述方法不可移植。@Simon,还有big/little endian。