C ++文件i / o错误?

时间:2011-03-31 08:09:16

标签: 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));
    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();

2 个答案:

答案 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的方法是逐字节移位。

那么,大问题 - 格式是什么?