PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TextDatei lesen



mile04
08-02-2005, 20:48
hallo
ich braüchte Ihre Hilfe dringend!
ich habe ein programm mit C++ geschrieben,das die folgende textdatei einliest und ausgibt.

Dateiname : Tabelle 1.1
Datum : 07.02.05
korrektur : ja


spannung
mess1 mess2 mess3 mess3
23 2 59 1
56 63 7 1
53 63 10 1



#include <fstream.h>
#include <iostream> // wegen cout/cin
#include <string.h> // wegen strcmp
#include <vector>
#include <cstddef> // wegen size_t

//using namespace std;

int lesen(); // Funktionsprototyp

int main()
{
lesen();
return 0;
}

//------------- lesen-Funktion ------------------------------------------------
int lesen()
{
char line[201], file[50];


ifstream inputstrom; // der argumentlose Konstruktor "fstream" erzeugt das Objekt"dat"
std::vector<std::vector<int> > matrix;
size_t vectorSize = 4;
size_t zeile=0;
int spalte=0;

//------------- Datei öffnen ------------------------
do
{ inputstrom.clear();
cout<<"Dateiname inklusive Pfad eingeben: ";
cin>>file;

inputstrom.open(file,ios::in|ios::nocreate); // die Methode"open" wird mit 2 Argumente aufgerufen
// (Dateiname,Dateimodus)
if(inputstrom.fail()) // Fehlertest durchführen
cout<<"Datei existiert nicht!"<<endl;

}while(inputstrom.fail());

//-------------- Datei lesen ----------------------------
do
{
inputstrom.getline(line,6);

if(!strcmp(line,"mess1"))
{
std::cout<<"\n"<<line<<"\n";

inputstrom.getline(line,50);


for(zeile = 0;inputstrom; ++zeile) // wenn input-Strom"inputstrom" true wird die Schleife durchgefürt
{
matrix.resize(zeile + 1); // Speicher für vector in matrix reservieren

// Speicher für den inneren vector reservieren
matrix[zeile].resize(4); // 4 Steht für die Anzahl der Elemente (Spalten)pro Zeile

// innere vector lesen
for(spalte= 0; (spalte < vectorSize) && inputstrom; ++spalte) //Das "inputstrom" soll verhindern, dass die innere Schleife
// über das Ende der Datei hinausliest
{
inputstrom>> matrix[zeile][spalte];
std::cout <<matrix[zeile][spalte]<< ' ';
}
std::cout << "\r\n";
}
// std::cout <<matrix[zeile][spalte];

}
inputstrom.clear();
inputstrom.getline(line,50);

}while(!inputstrom.eof());


inputstrom.close(); // "dat" wird wieder freigemacht (und Datei geschlossen).

cout<<"\n\n"<<endl;

return 0;
}
aber was ich nicht verstehe, dass das prog bei der Ausgabe noch eine Null ganz am Ende mit ausgibt!! ???

23 2 59 1
56 63 7 1
53 63 10 1
0 :confused:

Noch dazu möchte die Matrix am Ende complett mit:
std::cout <<matrix[zeile][spalte];
ausgeben das geht auch nicht!!

Hilfe!!!
danke schön

anda_skoa
08-02-2005, 20:59
hallo
aber was ich nicht verstehe, dass das prog bei der Ausgabe noch eine Null ganz am Ende mit ausgibt!! ???


Der Input wird nach der letzten Zahl vermutlich noch nicht aus sein, sondern wahrscheinlich noch ein newline enthalten.
Dadurch wird eine neue Zeile angefangen und erst nach dem erfolglosen Versuch, noch eine Zahl zu lesesn, ist die innere Schleifenbedingung nicht mehr gegeben.

Vermutlich wäre es besser einfach mit getline(inputstream, string) eine ganze Zeile zu lesen und dann aus dem std::string mit stringstream die Zahlen zu lesen.

Du könntest auch zusätzlich immer zuerst die vier Werte lesen und dann diesen Zeilenvektor mit push_back an die Matrix anhängen, dann hast du nie unvollständige Zeilen.

Btw, bei <fstream.h> ist das .h zuviel und wenn du statt char Arrays std::string nimmst, wird es viel robuster (einfach statt <string.h> <string> inkludieren und beim Vergleich direkt mit dem überladenene == Operator vergleichen)

Ciao,
_

mile04
08-02-2005, 21:57
vielen Dank skoa
würdest mir bitte das c++_code schreiben(ich habe es versucht aber :confused: ), wie es mit string das einlesen geht und in einem vector gespeichert.

wraith
09-02-2005, 16:21
Zum einlesen der Matrix


string line;
std::vector<std::vector<int> > matrix;

while(getline(inputstrom,line))
{
stringstream stream(line);

int nr[4];

if(stream >> nr[0] >> nr[1] >> nr[2] >> nr[3])
{
matrix.push_back(vector<int>(nr,nr + 4));
}
}

(du brauchst dazu noch den Header 'sstream')



Noch dazu möchte die Matrix am Ende complett mit:
std::cout <<matrix[zeile][spalte];
ausgeben das geht auch nicht!!

Du mußt zum Ausgeben zwei verschachtelte for-Schleifen schreiben.

Weiterhin ist ios::nocreate MSVC++ spezifisch, und du brauchst es auch nicht.

mile04
11-02-2005, 10:32
Vielen Dank wraith dein code klappt wunderbar aber wenn ich jetzt mein Textdatei erweitere mit eine andere Tabelle . ich habe den code auch erweitert aber klappt es leider nicht.!!

Dateiname : Tabelle 1.1
Datum : 07.02.05
korrektur : ja


spannung
mess1 mess2 mess3 mess3
23 2 59 1
56 63 7 1
53 63 10 1
Strom
22 33
47 25


string line;
std::vector<std::vector<int> > matrix;
std::vector<std::vector<int> > matrix2;
while(getline(inputstrom,line))
{
stringstream stream(line);

int nr[4];

if(stream >> nr[0] >> nr[1] >> nr[2] >> nr[3])
{
matrix.push_back(vector<int>(nr,nr + 4));
}
int col[2];

if(stream >> col[0] >> col[1] ) // !!!!diese Bed. wird nie durchgeführt
{
matrix2.push_back(vector<int>(col,col + 2));
}
for(int RowNum = 0;RowNum < (matrix.size()); ++RowNum)
{
// innere vector lesen
for(int ColNum= 0; (ColNum < 4); ++ColNum)
{

cout <<setw(5)<<matrix[RowNum][ColNum]<< ' ';
}
std::cout << "\r\n";
}

for(int Row = 0;Row < (matrix2.size()); ++Row)
{
// innere vector lesen
for(int nCol= 0; (nCol < 2); ++nCol)
{
cout <<matrix2[Row][nCol]<< ' ';
}
std::cout << "\r\n";
}



ich bedanke mich

wraith
11-02-2005, 11:48
Warum die eine Bedingung fehlschlägt ist klar, weil im stream nur 4 Zahlen drin waren, die wurden vorher ausgelesen, der Stream erreicht eof-State, und ende.

Das was du zusätzlich in die Datei eingefügt hast, liegt ja hinter deiner ersten 'Spannunug-Matrix'. Dh. du mußt erstmal diese einlesen, das machst ja bereits mit dem Ursprungscode, dann kommt irgend wann der String "Strom", und jetzt kannst du anfangen deine 'Strom-Matrix' einzulesen.

Die Schleifen zum Ausgeben der Matrizen würde ich auch erst hinter die Einlese-Schleife schreiben, also wenn die Matrizen komplett eingelesen wurden.

mile04
11-02-2005, 15:57
Warum die eine Bedingung fehlschlägt ist klar, weil im stream nur 4 Zahlen drin waren, die wurden vorher ausgelesen, der Stream erreicht eof-State, und ende..
das stimmt nicht die 2. if-Bed liegt direkt nach der 1.if. das Auslesen der stromwerte erfolgt auch innerhalb der while-schleife(ich könte es beim debuggen sehen) d.h. vor eof-state.


..

Die Schleifen zum Ausgeben der Matrizen würde ich auch erst hinter die Einlese-Schleife schreiben, also wenn die Matrizen komplett eingelesen wurden.
du hast recht.ich habe mich einfach vertippt. ich hab es auch genauso wie du gesagt hast.

danke sehr