Wczytywanie kolumny liczb z pliku .txt

0

Dzień dobry, muszę napisać program, który pobiera 3 kolumny danych (liczb pomiarowych) z pliku .txt i odczytuje je. Następnie, muszę "wyciągnąć" 2 kolumny z odczytanego pliku i stworzyć z nich osobny plik .txt. Niestety nie do końca wiem jak się do tego zabrać, gdyż standardowe file>>...; nie pomaga. Co zrobić w takiej sytuacji? Poniżej to co udałymi się juz stworzyć. Z góry dziękuję za pomoc

**EDIT - ** dane pierwotnie były w pliku .dat, który przekonwertowałem na .txt. Dane są oddzielone tabulatorem

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

using namespace std;

string path;
string line;
int line_num = 1;
string tension, intensivity, foto;


/************************************************/ 
int main()
{
    ifstream file;
    cout<<"Path: ";
    cin >>path;
    
    file.open(path, ios::in);
    if(file.good() == false)
    {
        cout<<"File failed to open"<<endl;
        exit(0);
    }
    while(getline(file,line))
    {
    cout<<line_num++<<"."" "<<line<<endl;
    
    }
    
 /***********************************************/
    
  file.open( path, ios::in | ios::out );
  if( file.good() == true )
  {
  while (!(file.eof()))
  {
  file >>tension>>intensivity;
      cout << tension << endl;
      cout << intensivity << endl;
  }

      file.close();
  }
  
      
return 0;

 
}
0

czy te kolumny są oddzielone jakimś stałym znakiem? Np ;, spacją albo \t?

0

Tak, dane są oddzielone spacją/tabulatorem.

0

No to bym je po prostu wczytywał linia po linii i wybrane kolumny zapisywał. Zakładając, że są 4 kolumny i chcemy kolumnę 2 i 3:

int col1, col2;
string col3, col4;
vector<int> col2_vals;
vector<string> col3_vals;
while(file >> col1 >> col2 >> col3 >> col4) {
    col2_vals.push_back(col2);
    col3_vals.push_back(col3);
}
0

Czy mógłby Pan na podstawie mojego kodu pokazać jak to ma wyglądać? Zrobiłem według pańskiego przepisu i nadal otrzymuje tylko wejściowe 3 kolumny.

0

Pokaż obecny kod i dane.

0
string path;
string line;
int line_num = 1;
string tension, intensivity, foto;
string newfile;
vector<string> tension_vals;
vector<string> intensivity_vals;

//************************************************/ // odczytanie pliku
int main()
{
    ifstream file;
    cout<<"Path: ";
    cin >>path;
    
    file.open(path, ios::in);
    if(file.good() == false)
    {
        cout<<"File failed to open"<<endl;
        exit(0);
    }
    while(getline(file,line))
    {
    cout<<line_num++<<"."" "<<line<<endl;
    
    }
    
 //***********************************************/
    
    
    
    file.open( path, ios::in | ios::out );
  if( file.good() == true )
  {
  
  while(file >> tension >> intensivity)
  {
      tension_vals.push_back(tension);
      intensivity_vals.push_back(intensivity);
  }
      cin>>tension;
      cin >> intensivity;
      
      fstream file1;
        file1.open("newfile.txt", ios::out);
        file1<<tension<<endl;
        file1<<intensivity<<endl;
     
  }
  
      
return 0;

}

Pozwolę sobie wkleić tylko część danych bo jest ich 300 linijek

U [V] I [A] I Ifotodiody[A]
-3.2390179 -0.01730551708430011 1.55668804E-009
-3.1702013 -0.0169684896826897 6.20708276E-010
-3.1032648 -0.01664764024001825 2.6650721E-009
-3.0359219 -0.01632308278968922 9.62249638E-010
-2.9686813 -0.01599790452371968 -1.57972368E-009
-2.901561 -0.01567262394733258 -7.27899922E-010
-2.8347417 -0.01534713577019531 1.4047122E-009
-2.7676012 -0.01501917625015632 1.70539665E-009
-2.7015579 -0.01469461681321724 3.37145449E-009

0

A dane?

0

Już edytowałem :)

0
int main()
{
    vector<double> c1, c2, c3;
    double e1, e2, e3;
    ifstream f("data.txt");
    while(f >> e1 >> e2 >> e3) {
        c1.push_back(e1);
        c2.push_back(e2);
        c3.push_back(e3);
    }
    DBG_CONT(c1);
    DBG_CONT(c2);
    DBG_CONT(c3);
}

https://wandbox.org/permlink/u6BT42qgZsd8Wfl8

0

Jak rozumiem, vector<double> c1 etc odnosi się do nazwy tabeli, natomiast nie do konta wiem co będzie e1, jeśli mógłbym prosić o sprostowanie.

0

element z danego rzędu.

0

Czyli w zasadzie mogę zostawić to e1 a i tak wyrzuci mi wszystkie 300 wartości z kolumny tak?

0

Co rozumiesz przez zostawić?

0
vector<double> c1, c2, c3; // tension, intensity, foto; tutaj?
    double e1, e2, e3; // wtedy co tutaj? 
    ifstream f("data.txt");
    while(f >> e1 >> e2 >> e3) {
        c1.push_back(e1);
        c2.push_back(e2);
        c3.push_back(e3);
    }
    DBG_CONT(c1);
    DBG_CONT(c2);
    DBG_CONT(c3);

e1, e2, e3 są moimi nazwami, czyli tension etc? Czy c1 etc to nazwy? I co wtedy wstawić do C i E

0

cx to kolumny. ex to obecnie wczytywane elementy tych kolumn (z obecnej linii)

0

Obecnie wyskakuje błąd: Use of undeclared identifier 'DBG_CONT'

 while(file >> e1 >> e2)
    {
      tension.push_back(e1);
      intensivity.push_back(e2);
      
    }
   DBG_CONT(tension);
   DBG_CONT(intensivity);
   }
0

To są moje debugowe makra do pokazywania kodu. Staraj się zrozumieć otrzymany kod...

0

Dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1