Läsa in från en fil till en struct i c++

Permalänk
Medlem

Läsa in från en fil till en struct i c++

Hej alla glada igen.

Jag försöker fortfarande lära mig några användbara aspekter av c++.

Ska läsa in från en fil och lagra det i en struct.

#include <cstring> #include <vector> #include <cstdlib> #include <fstream> #include <iostream> using namespace std; struct katalog { string namn; int nummer; string stad; string adress; }; void fyllvektor(vector< struct katalog >& almanacka) { int i=0 fstream file; file.open("telefonbok.txt"); do { file.getline(almanacka[i].namn, "|"); file.getline(almanacka[i].nummer, "|"); file.getline(almanacka[i].stad, "|"); file.getline(almanacka[i].adress, "|"); i++; }while(!file.eof()); file.close(); } int main(void) { vector< struct katalog > almanacka; fyllvektor(almanacka); }

filen ser ut såhär:

Anders Andersson|0362623|Ingenstans|Ingengatan 20 Stefan Karlsson|05444444|Drickalugnt|Supargatan 3

Vad jag försöker göra är helt enkelt en telefonbok.

Edit: Lade till lite kod.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Re: Läsa in från en fil till en struct i c++

Citat:

Ursprungligen inskrivet av kerberos

do { file.getline(almanacka[i].namn, "|"); file.getline(almanacka[i].nummer, "|"); file.getline(almanacka[i].stad, "|"); file.getline(almanacka[i].adress, "|"); i++; }while(!file.eof()); file.close(); }

filen ser ut såhär:

Anders Andersson|0362623|Ingenstans|Ingengatan 20 Stefan Karlsson|05444444|Drickalugnt|Supargatan 3

Förstår inte frågan.

Kanske inte gör något, men du har ingen avslutande "|" i textfilen.

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Medlem

Om du byter ut nummer till typen string istället blir det lite lättare (du ska väl ändå inte utföra beräkningar med telefonnummret).

#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; struct katalog { string namn; string nummer; string stad; string adress; }; int main() { ifstream file( "adress.txt" ); vector< katalog > k; while( !file.eof() ) { katalog temp; getline( file, temp.namn, '|' ); getline( file, temp.nummer, '|' ); getline( file, temp.stad, '|' ); getline( file, temp.adress ); k.push_back( temp ); } for( int i = 0; i < k.size(); ++i ) { cout << k[i].namn << ' ' << k[i].nummer << ' ' << k[i].stad << ' ' << k[i].adress << '\n'; } }

Du behöver inte använda struct framför katalog på alla ställen i C++. Det behövs bara i C.

Permalänk
Medlem

Åh, det var bra information. Tackar. Ser snyggare ut om man inte har struct överallt.

Edit:
Allt fick tuppjuck när jag försökte lägga till så att man kan skriva information till filen...

int new_adress(vector< katalog >& k) { katalog temp; ofstream file( "telefonbok.txt"); if (! file) { cout << "Error opening file telefonbok.txt" << endl; return -1; } cout << "Vad heter personen? " << endl; getline(cin, temp.namn); cout << "Telefonnummer? " << endl; getline(cin, temp.nummer); cout << "Vilken stad? " << endl; getline(cin, temp.stad); cout << "Vilken adress? " << endl; getline(cin, temp.adress); cout << "Lägger till följande i databasen: \n"; cout << temp.namn << "|" << temp.nummer << "|" << temp.stad << "|" << temp.adress << endl; file << temp.namn << "|" << temp.nummer << "|" << temp.stad << "|" << temp.adress << endl; k.push_back( temp ); file.close(); return 0; }

int main(void) { vector< katalog > kat; fyllvektor(kat); if (!new_adress(kat)) {cout << "\n\n Success!\n";} }

fyllvektor vet jag att den funkar, det gjorde den innan jag skrev new_adress().

Felmeddelandena är flera sidor långa.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Kompilerar fint för mig. Har du ändrat nummer till en string? Annars funkar inte getline. Posta felmeddelandet ändå

Permalänk
Medlem

Mysko, det kompilerar på den här datorn, men inte på min laptop.

Edit:
Nu kompilerar det på min laptop också, måste ha skrivit något fel helt enkelt.

Edit2: För att förhindra att filen skrivs över, kör man bara ofstream( "telefonbok.txt", ios::app) ?

Edit3:

En till fråga.

Kan man vid utskrift se till att det blir ett bestämt antal tecken och att alla poster får blanksteg innan sig för att fylla upp den mängden?

Så det blir

Karl Urban | 0533533 | Köpingfors | Köpingatan 30 Stefan Karlsson | 0833353 | Hen | Storgatan 30

Har för mig att det gick med printf, så det borde ju funka med cout.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Man använder ios::app, ja. Det kunde du ju bara testat För att skriva ut som du vill:

for( int i = 0; i < k.size(); ++i ) { cout << setw( 20 ) << setfill( ' ' ) << left << k[i].namn << ' ' << setw( 10 ) << setfill( ' ' ) << left << k[i].nummer << ' ' << setw( 15 ) << setfill( ' ' ) << left << k[i].stad << ' ' << setw( 15 ) << setfill( ' ' ) << left << k[i].adress << '\n'; }

Du måste inkludera iomanip då.

Permalänk
Medlem

Löste det med

cout.width(16);
cout << k[i].namn;

osv.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.