Wczytywanie kolumny liczb z pliku .txt

Odpowiedz Nowy wątek
2020-03-24 16:45

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

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;

}
edytowany 3x, ostatnio: cerrato, 2020-03-24 17:12

Pozostało 580 znaków

kq
2020-03-24 16:45
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

0

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


Pozostało 580 znaków

2020-03-24 16:48

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

0

Tak, dane są oddzielone spacją/tabulatorem.

Pozostało 580 znaków

kq
2020-03-24 16:52
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

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);
}

Pozostało 580 znaków

2020-03-24 17:08

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

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.

Pozostało 580 znaków

kq
2020-03-24 17:09
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

0

Pokaż obecny kod i dane.


Pozostało 580 znaków

2020-03-24 17:11

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

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

edytowany 1x, ostatnio: mjk33, 2020-03-24 17:26

Pozostało 580 znaków

kq
2020-03-24 17:23
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

0

A dane?


Pozostało 580 znaków

2020-03-24 17:26

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

0

Już edytowałem :)

Pozostało 580 znaków

kq
2020-03-24 17:34
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Szczecin

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


edytowany 2x, ostatnio: kq, 2020-03-24 17:34

Pozostało 580 znaków

2020-03-24 17:41

Rejestracja: 1 tydzień temu

Ostatnio: 1 tydzień temu

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.

Pozostało 580 znaków

Odpowiedz

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