Почему я получаю ошибку запуска после запуска программы и выдачи ожидаемых результатов? - PullRequest
0 голосов
/ 28 марта 2019

Я делаю домашнее задание для класса C ++, мне поручено создать структуру, которая будет содержать данные для 4 подразделений компании и данные о продажах за каждый квартал.Я должен сохранить структуру в двоичном файле, а затем повторно импортировать ее и прочитать данные.На самом деле все работает, как и ожидалось, однако после вывода я получаю RUN FAILED, ошибка кода выхода 1.

Сначала я думал, что это из-за какого-то массива вне границ, но оглядываясь на код, я не могу найтиit.

 * Author: James Hartley
 * Created on March 27, 2019, 10:09 PM
 * Description: Gaddis Ch.12 Problem 11-12 Corporate Sales Data Output/Input
 */

#include <iostream>
#include <fstream>

using namespace std;

struct division {
    string name;
    int qtrSales[4];
};

void structToFile(string fileName, division* div, int arySize) {
    fstream fileObject;
    fileObject.open(fileName, ios::out | ios::binary);
    fileObject.write(reinterpret_cast<char *>(div), sizeof(division) * arySize);
    fileObject.close();
}

void fileToStruct(string fileName, division* div, int arySize) {
    fstream fileObject;
    fileObject.open(fileName, ios::in | ios::binary);
    fileObject.read(reinterpret_cast<char *>(div), sizeof(division) * arySize);
    fileObject.close();
}

int main(int argc, char** argv) {
    division divs[4];
    division divsImport[4];
    divs[0].name = "East"; divs[1].name = "West"; divs[2].name = "North"; divs[3].name = "South";


    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            cout << "Please enter Quarter " << j+1 << " sales for " << divs[i].name << " division" << endl;
            cin >> divs[i].qtrSales[j];
        }
    }

    structToFile("struct.dat", divs, 4);
    fileToStruct("struct.dat", divsImport, 4);

    for (int i = 0; i < 4; i++) {
        cout << "Division: " << divsImport[i].name << endl;
        for (int j = 0; j < 4; j++) {
            cout << "Quarter: " << j+1 << endl;
            cout << "Sales: " << divsImport[i].qtrSales[j] << endl;
        }
    }
    return 0;
}

Он выводит корректно, однако сообщает мне, что после выхода RUN FAILED код выхода 1.

1 Ответ

4 голосов
/ 28 марта 2019

Ваше структурное подразделение содержит std::string, который не является тривиально копируемым типом.std::string, как правило, будет содержать указатели на динамическое распределение памяти, которые действительны только до тех пор, пока существует конкретный строковый объект.Вы не можете просто записать биты, составляющие объект std::string, на диск, прочитать его обратно в объект std::string и ожидать, что у вас будет действительный std::string.

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