Не удалось прочитать данные с помощью reinterpret_castв C ++ - PullRequest
0 голосов
/ 02 января 2019
#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. Где я сделал не так?

1 Ответ

0 голосов
/ 02 января 2019

Как было отмечено в комментариях, у вас есть как минимум две ошибки:

Первая проблема заключается в ваших чтениях: оба чтения используют адрес x и размер y,Я уверен, что это просто опечатка.

Во-вторых, вам нужно close() файл, который вы открыли для записи (или, по крайней мере, очистить ваши записи (sync()) доповторное чтение тех же данных, но для этого требуется много осторожности и специальных правил.) В любом случае, вам нужно закрыть файл, либо оставив дескриптор (в данном случае file) вне области видимости и получив деструктор с именемили сам звоните file.close() (после записи)

Чтобы избежать этой проблемы, вам обычно приходится проверять наличие ошибок каждый раз, когда вы делаете какие-либо операции ввода-вывода.Для этого вы можете использовать имя вашего дескриптора файла, например, логическую переменную, например:

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;

Если вы хотите знать, что на самом деле происходит, класс std::istream имеет явное преобразование вbool, который возвращает, была ли последняя операция выполнена успешно или нет (или находится ли поток в читаемом / хорошем состоянии или нет.) Существует также множество функций-членов, определенных для потоков C ++ (как входных, так и выходных), которые помогают вам проверитьдля ошибок, конца потока и т. д., например, bad(), good(), fail(), eof() и т. д.

Опять же, просто помните, что любая операция ввода-вывода может завершиться неудачно прив любое время по разным причинам, поэтому проверьте его статус!

...