1

この C++ プログラムは、Visual Studio 2010 を使用して作成されています。これは、クラスの全員が困惑するグループ プロジェクトです。
プログラムは最初は正常に起動し、ユーザーはプログラムを実行して、ファイルに書き出された項目を追加できます。項目が読み込まれ、表示されます。
ユーザーが終了すると、プログラムを終了return 0;すると、「System.AccessViolationException 型の未処理の例外が発生しました。保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。」
これが発生すると、 utility here => for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter; *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter) (*_Pnext)->_Myproxy = というファイルが開きます。 0.
これを次のように置き換えることreturn 0;で修正できますexit(0);
私はそれが本当の修正ではなく、この問題を引き起こしている銃弾の穴に対するバンドエイドであることを知っています. それを修正
した後(ここでは大まかに使用)、プログラムを再度実行すると、ファイル システムからデータ ファイルをロードしようとします。最初の項目を正しく読み取ってベクターにロードしますが、ループの最初に戻ると、同じ例外ポップアップが表示されます。タイプ System.AccessViolationException の未処理の例外が発生しました。 これは、fstream とバイナリ I/O を使用して取り組んだ最初のプロジェクトです。問題なく文字列を読み書きするだけの同様のプログラムを使用しました。この問題は fileHandler クラスの何かに起因すると考えていますが、この問題の原因を特定するのに苦労しています。


アドバイス/ヘルプをいただければ幸いです。

これがコードです。

stdafx.h

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>
#include <fstream>
#include <string.h>
#include <string>
#include <vector>
#include <time.h>


Week2.cpp (プロジェクトのメイン ファイル)

//Week2.cpp *******************

#include "stdafx.h"
#include "fileHandler.h"


using namespace std;
using namespace System;


int main(array<System::String ^> ^args)
{   

fileHandler theFile("store.pkl");
vector<item> itemStack = theFile.getFile();

cout << "SKU  Name  Dept  Vendor    Max Order onHand" << endl;
cout << "-------------------------------------------" << endl;
for (int i = 0; i < itemStack.size(); i++)
{
    cout << itemStack[i].toString() << endl;
}
vector<item> newStack;

//prompt for input
bool doneEditing = false;

while(!doneEditing)
{
    int A;
    int E;
    int F;
    int G;
    string B;
    string C;
    string D;
    string tempString;
    cout << "Enter item info:" << endl << "Item SKU: ";
    cin >> A;
    cout << endl << "Item Name: ";
    cin >> B;
    cout << endl << "Item Dept: ";
    cin >> C;
    cout << endl << "Vendor Name: ";
    cin >> D;
    cout << endl << "Max Number: ";
    cin >> E;
    cout << endl << "Reorder Number: ";
    cin >> F;
    cout << endl << "OnHand Number: ";
    cin >> G;
    cout << endl << "Done?? Y/N: ";
    cin >> tempString;
    cout << endl;

    item tempItem = item(A, B, C, D, E, F, G);
    newStack.push_back(tempItem);

    if (tempString == "Y" || tempString == "y")
    {
        doneEditing = true;
    }
    }
    cout << "Saving stack to file" << endl;
    theFile.putFile(newStack);
    cout << "Items written to file" << endl;

    vector<item> newFileStack = theFile.getFile();

    cout << "After reload: " << endl;
    cout << "SKU  Name  Dept  Vendor    Max Order onHand" << endl;
    cout << "-------------------------------------------" << endl;
    for (int i = 0; i < newFileStack.size(); i++)
    {
    cout << newFileStack[i].toString() << endl;
    }

    cout << "Thank you for using the Awesome Grocery Inventory Application" << endl;

    system("PAUSE");
    /*return 0;   this breaks with same error as 
                  when reading in saved file after application restart 
                  */
    exit(0);
}


item.h

using namespace std;

#pragma once
class item
{
public:
item();
item(int sku, string name, string dept, string vendor, int max, int reorder, int onhand);
~item(void);
string toString();

int ItemSKU() const;
void ItemSKU(int val);
string ItemName() const;
void ItemName(string val);
string VendorName() const;
void VendorName(string val);
int MaxNumb() const;
void MaxNumb(int val);
int ReorderNumb() const;
void ReorderNumb(int val);
int OnHandNumb() const;
void OnHandNumb(int val);

private:
int itemSKU;
string itemName;
string itemDept;
string vendorName;
int maxNumb;
int reorderNumb;
int onHandNumb;
};


item.cpp

#include "StdAfx.h"
#include "item.h"

using namespace std;

item::item()
{

};
item::item(int sku, string name, string dept, string vendor, int max, int reorder, int onhand)
{
itemSKU = sku;
itemName = name;
itemDept = dept;
vendorName = vendor;
maxNumb = max;
reorderNumb = reorder;
onHandNumb = onhand;
}

item::~item(void)
{
}

string item::toString()
{
stringstream ss;
ss << itemSKU << "\t" << itemName << "\t" << itemDept << "\t" << vendorName << "\t" << maxNumb << "\t" << reorderNumb << "\t" << onHandNumb;
string s = ss.str();
return s;
}

int item::ItemSKU() const { return itemSKU; }
void item::ItemSKU(int val) { itemSKU = val; }

string item::ItemName() const { return itemName; }
void item::ItemName(string val) { itemName = val; }

string item::VendorName() const { return vendorName; }
void item::VendorName(string val) { vendorName = val; }

int item::MaxNumb() const { return maxNumb; }
void item::MaxNumb(int val) { maxNumb = val; }

int item::ReorderNumb() const { return reorderNumb; }
void item::ReorderNumb(int val) { reorderNumb = val; }

int item::OnHandNumb() const { return onHandNumb; }
void item::OnHandNumb(int val) { onHandNumb = val; }


fileHandler.h

#include "item.h"

using namespace std;

#pragma once
class fileHandler
{
public:
fileHandler(string);
~fileHandler(void);

vector<item> getFile();
void putFile(vector<item> &);

private:
string theFileName;
};


fileHandler.cpp

#include "stdafx.h"
#include "fileHandler.h"

using namespace std;

fileHandler::fileHandler(string name)
{
theFileName = name.c_str();
}

fileHandler::~fileHandler(void)
{
}


vector<item> fileHandler::getFile()
{
ifstream inFile;
string fileLine;
vector<item> localStack;

inFile.open(theFileName, ios::in|ios::binary);
if (inFile)
{
    cout << "Getting file..." << endl;
    cout << endl;
    // not working on initial load if file is present at start
    inFile.seekg(0);
    while(!inFile.eof())
    {
        item tempItem;
        inFile.read(reinterpret_cast< char * >(&tempItem), sizeof(item));
        localStack.push_back(tempItem);
        cout << "item added to stack" << endl;
    } //breaks from here after reading in 1 item from saved file on reopen
} else {
    ofstream newFile;
    newFile.open(theFileName, ios::out|ios::binary);
    newFile.close();
    cout << "Creating new file..." << endl;
    cout << endl;
    inFile.open(theFileName, ios::in|ios::binary);
}
inFile.clear();
inFile.close();
if (localStack.size() > 0)
{
    //removes some dirty data from end of stack
    localStack.pop_back();
}
return localStack;
}

void fileHandler::putFile( vector<item> &items )
{
ofstream outFile;
outFile.open(theFileName, ios::out|ios::binary);
if(!outFile)
{
    cerr<<"File could not be created"<<endl;
    system("pause");
    exit(1);
}
for (int i = 0; i < items.size(); i++)
{

    outFile.write(reinterpret_cast<const char *>(&items[i]), sizeof(item));
}
outFile.clear();
outFile.close();
}
4

1 に答える 1

0

std::stringメンバーを含むオブジェクトに対して、この方法でバイナリ I/O を実行することはできません。Astd::stringには、実際のコンテンツ用に動的に割り当てられたメモリへのポインタが含まれています。代わりに、ある種のシリアライゼーションを実行する必要があります。通常の提案はBoost serializationです。

于 2012-08-30T19:40:20.930 に答える