Ошибка ввода-вывода файла C ++? - PullRequest
0 голосов
/ 31 марта 2011

Почему все читается как 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 ]

1 голос
/ 31 марта 2011

Не зная содержания 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;
        }
    }
}
0 голосов
/ 31 марта 2011

atoi преобразует завершенную NUL-строку в целое число - вы читаете четыре байта из файла (он находится в двоичном режиме) - что может быть неверно ..

например, допустимая строка (для atoi для работы может быть, "1234" - ПРИМЕЧАНИЕ: NUL прекращено), однако байтовое представление этого 0x31 0x32 0x33 0x34 (примечание NUL завершено, если вы прочитали только 4 байта так что atoi может делать что угодно). Каков формат этого файла? Если это действительно байтовое представление, число 1234 будет выглядеть (в зависимости от порядка байтов) 0x00 0x00 0x04 0xD2, способ правильно прочитать это int будет сдвиг в байтах за байтом.

Итак, большой вопрос - что это за формат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...