Hvorfor er størrelsen på min vektor full av structs så stor når jeg legger det er serie inn fra en fil?

stemmer
1

Som de fleste av dere kan følge min linje av spørsmålene allerede vet, jeg prøver å lage et program som kan serial flere structs til en .dat fil, kan du lese dem tilbake i via laste det er serialisering, redigere innholdet, og deretter re- skrive dem til fil og så videre. Det er en inventar program jeg prøver å gjøre, og jeg kan ikke få det til å fungere for livet av meg.

Filen jeg laster inn, er blank. Mitt program tar som 10 sekunder å selv laste og nå vet jeg hvorfor. Det er årsaken størrelsen på min vektor er som 250 000. Å vente ... denne gangen jeg kjørte den på størrelse med min vektor var 5.172.285. Dvs en ganske stor vektor full av structs. Det er ikke noen kjøre-tid eller kompilere feil, men jeg er ganske sikker på at jeg gjør noe galt. Filen jeg laster inn er helt blank også.

Kode:

// Project 5.cpp : main project file.

#include stdafx.h
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace System;
using namespace std;
#pragma hdrstop

int checkCommand (string line);

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec);

template<typename T>
vector<T> readVector(ifstream &in);

struct InventoryItem {
    string Item;
    string Description;
    int Quantity;
    int wholesaleCost;
    int retailCost;
    int dateAdded;
} ;


int main(void)
{
    cout << Welcome to the Inventory Manager extreme! [Version 1.0] << endl;
    ifstream in(data.dat);
    if (in.is_open()) { cout << File \'data.dat\' has been opened successfully. << endl; } else { cout << Error opening data.dat << endl; return 0;}
    cout << Loading data... << endl;
    vector<InventoryItem> structList = readVector<InventoryItem>( in );
    cout <<Load complete. << endl;

    while (1)
    {

        string line = ;
        cout << There are currently  << structList.size() <<  items in memory.;
        cout << endl;
        cout << Commands:  << endl;
        cout << 1: Add a new record  << endl;
        cout << 2: Display a record  << endl;
        cout << 3: Edit a current record  << endl;
        cout << 4: Exit the program  << endl;
        cout << endl;
        cout << Enter a command 1-4: ;

        getline(cin , line);


        int rValue = checkCommand(line);
        if (rValue == 1)
        {
            cout << You've entered a invalid command! Try Again. << endl;
        } else if (rValue == 2){ 
            cout << Error calling command! << endl;
        } else if (!rValue) {
            break;
        }
    }


    system(pause);

    return 0;
}

int checkCommand (string line)
{
    int intReturn = atoi(line.c_str());
    int status = 3;

    switch (intReturn)
    {
        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            status = 0;
            break;
        default:
            status = 1;
            break;
    }
    return status;
}

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec)
{
    out << vec.size();

    for(vector<T>::const_iterator i = vec.begin(); i != vec.end(); i++)
    {
        out << *i;
    }
}

ostream &operator<<(ostream &out, const InventoryItem &i)
{
    out << i.Item << i.Description;
    out << i.Quantity;
    out << i.wholesaleCost << i.retailCost;
    out << i.dateAdded;
    return out;
}

istream &operator>>(istream &in, InventoryItem &i)
{
    in >> i.Item >> i.Description;
    in >> i.Quantity;
    in >> i.wholesaleCost >> i.retailCost;
    in >> i.dateAdded;
    return in;
}



template<typename T>
vector<T> readVector(ifstream &in)
{
    size_t size;
    in >> size;

    vector<T> vec;
    vec.reserve(size);

    for(unsigned int i = 0; i < size; i++)
    {
        T tmp;
        in >> tmp;
        vec.push_back(tmp);
    }

    return vec;
}

Kan noen bare vise meg hvordan du slår dette til et program som faktisk kan skrive serie vektorer full av structs til en fil, og deretter lese dem tilbake i slik at jeg kan redigere dem og lagre dem tilbake for lasting senere? Oh my godhet hva en tur dette har vært!

TAKK for hjelp du kan gi!

Publisert på 02/04/2009 klokken 07:38
kilden bruker
På andre språk...                            


4 svar

stemmer
5

Du sier at filen er faktisk tom. Den første linjen i readVector er dette:

in >> size;

Hva gjør anta at du er faktisk kommer til å ende opp i størrelse? Siden det er tomt, vil dette resultere i en feil som du ikke oppdager. Den variable sizevil forbli uninitialised - derav du se merkelige verdier i det, siden det tar uansett verdi tilfeldigvis i minnet på det tidspunktet. Du kan sjekke status for strøm ved hjelp av sjekk:

if (in)

Behandle det i boolsk sammenheng forteller deg om det oppstod en feil - dette vil også dekke ting som det å ikke kunne lese i et gyldig heltall variabel. Jeg foreslår at du bør finne ut hvordan du kjører programmet i en debugger, vil du være i stand til å gå gjennom koden din og se hva verdiene av variablene er på et gitt tidspunkt.

Svarte 02/04/2009 kl. 07:45
kilden bruker

stemmer
3

Hvis inndatafilen er tom, så det vectorbør være tom. Du bør ikke gå forbi linjen:

if (in.is_open()) 

- programmet (når jeg kjører det på min maskin) avsluttes.

Kan du forklare hvorfor du har følgende?

#include <String>

using namespace System;

#pragma hdrstop

Den enkleste å gjennomføre, er å lese i filinnholdet på en gang, holde elementene i minnet, redigere dem i minnet og skrive ut til fil når gjennom med redigering. Dette er selvfølgelig ikke en veldig god teknikk fra minne fotavtrykk eller ytelse synspunkt. Men så, problemet du prøver å løse er ikke trivielt. Les FAQ 36 for å få en bedre forståelse av oppgaven.

Svarte 02/04/2009 kl. 07:46
kilden bruker

stemmer
3

Så hvis filen er tom og du gjør:

size_t size;
in >> size;

vector<T> vec;
vec.reserve(size);

Hva tror du vil skje? Størrelse kan ikke leses og bruker en tilfeldig verdi

Svarte 02/04/2009 kl. 07:46
kilden bruker

stemmer
0

Du bruker tomme filer, men når du går å laste ned filen, er du ute etter en størrelse. Når filen ikke har en størrelse på filen, kan du få søppel i din størrelse variabel.

Så prøver å sette en null i den første linjen av "Data.dat-fil.

Edit: Ovennevnte forslag var bare en midlertidig løsning. Du kan prøve dette:

in >> size;
//input operation failed
if(in.fail())
    //return, or whatever you need to do
Svarte 02/04/2009 kl. 07:47
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more