2013-09-30 5 views
5

In C++ möchte ich eine Textdatei mit Spalten von Floats lesen und sie in einem 2D-Array.C++ lesen Float-Werte von. TXT und legte sie in eine unbekannte Größe 2D-Array

Erste Zeile wird die 1. Spalte und so weiter.

Die Größe des Arrays ist unbekannt, es hängt von den Zeilen und Spalten ab, die variieren können.

Ich habe versucht mit "getline", "inFile >>", aber alle Änderungen, die ich gemacht habe, haben einige Probleme.

Zum Beispiel Gibt es eine Möglichkeit, die unnötigen Zeilen/Zeilen zu entfernen, nachdem die Werte vorhanden sind?

Datei sieht wie folgt aus (+/-):

  • Zeichen "\ t" Zeichen "\ t" Zeichen "\ n"
  • float "\ t" float "\ t" float " \ t "float" \ n "
  • float" \ t "float" \ t "Float" \ t "float" \ n "
  • Float" \ t "Float" \ t "float" \ t "float "\ n"

Danke

0 jetzt

Bis ich habe dies:

int ReadFromFile(){ 

ifstream inFile; 
ofstream outFile; 

int nLinActual = 0; 
const int nCol = 9; 
const int nLin = 10; 

// open file for reading 
inFile.open("values.txt"); 
// checks if file opened 
if(inFile.fail()) { 
    cout << "error loading .txt file reading" << endl; 
    return 1; 
} 
// open file for writing 
outFile.open ("outArray.txt"); 
// checks if file opened 
if(outFile.fail()) { 
    cout << "error loading .txt file for writing" << endl; 
    return 1; 
} 

// Doesn't read the first line 
string dummyLine, dummyLine2, dummyLine3; 
getline(inFile, dummyLine); 

// Declares Array 
float values[nLin][nCol]; 

//Fill Array with -1 
for(int l=0; l<nLin; l++) 
    for(int c=0; c<nCol; c++) 
     values[l][c] = -1; 

// reads file to end of *file*, not line 
while(!inFile.eof()) { 

    for (int i=0; i<nCol; i++) { 
     inFile >> values[i][nLinActual]; 
    } 
    i=0;  
    ++nLinActual; 
} 

// Check what's happening 
cout << endl; 
for(int l=0; l<nLin; l++){ 
    for(int c=0; c<nCol; c++){ 
     cout << values[l][c] << "\t"; 
     outFile << values[l][c] << "\t"; 
    } 
    cout << endl; 
    outFile << endl; 
} 

inFile.close(); 
outFile.close(); 


return 0; 

}

+1

Am besten, einige Code zu posten und geben Sie mehr Details über die "Probleme", die Sie damit hatten. –

+0

Wie sieht die Datei aus? Kannst du deinen Beitrag bearbeiten? – 0x499602D2

+0

Mein Code funktioniert jetzt, siehe unten. – 0x499602D2

Antwort

1

Ich denke, das Ihnen helfen könnte. Verwenden Sie einen Vektor eines Vektors vom Typ float, da Ihnen die Anzahl der Elemente nicht bekannt ist. Dieser Code setzt voraus, dass Sie eine float Nummern haben, die an jeder Zeile durch Leerzeichen getrennt sind.

fstream fs; 
fs.open("abc.txt",ios::in); 
vector<vector<float>> floatVec; 
string strFloat; 
float fNum; 
int counter = 0; 
while(getline(fs,strFloat)) 
{ 
    std::stringstream linestream(strFloat); 
    floatVec.push_back(std::vector<float>()); 
    while(linestream>>fNum) 
     floatVec[counter].push_back(fNum); 
    ++counter; 
} 
+0

Ihr Code wird nicht tatsächlich kompiliert. – 0x499602D2

+0

Normalerweise sind die Zahlen in der Textdatei durch Tabulatoren oder Leerzeichen voneinander getrennt. Ist es möglich mit Arrays zu arbeiten? – JMG

+0

@ 0x499602D2 tatsächlich kompiliert für mich aber eine Ausnahme ausgelöst. Danke für das Aufzeigen !! – Saksham

5

Der einfachste Weg ist es, einen Vektor zu verwenden:

#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 
#include <fstream> 

int main() 
{ 
    std::fstream in("in.txt"); 
    std::string line; 
    std::vector<std::vector<float>> v; 
    int i = 0; 

    while (std::getline(in, line)) 
    { 
     float value; 
     std::stringstream ss(line); 

     v.push_back(std::vector<float>()); 

     while (ss >> value) 
     { 
      v[i].push_back(value); 
     } 
     ++i; 
    } 
} 

Update: Sie sagen, Sie es Bedarf mit rohem C-Arrays durchgeführt werden. Sicher, das kann gemacht werden:

int main() 
{ 
    std::ifstream in("in.txt"); 
    std::string line; 

    float v[9][10]; 
    int i = 0, k = 0; 

    while (std::getline(in, line)) 
    { 
     float value; 
     int k = 0; 
     std::stringstream ss(line); 

     while (ss >> value) 
     { 
      v[i][k] = value; 
      ++k; 
     } 
     ++i; 
    } 
} 
+0

sollten Sie nicht den Zähler außerhalb der inneren Schleife erhöhen? – Saksham

+0

@Saksham Ja, danke – 0x499602D2

+0

und jetzt haben Sie ein Semikolon verpasst :) – Saksham

Verwandte Themen