C++ fájlból beolvasás

C++ fájlból beolvasás
2021-10-20T08:26:55+02:00
2021-10-23T00:32:10+02:00
2022-10-15T21:20:22+02:00
Levente Csordás
Hogy lehet fájlból beolvasva mátrix elemein végigmenni úgy, hogy nem használok tömböt, vektort?



Én úgy kezdtem, hogy első sort beolvastam getline-nal, megszámoltam a szóközöket, majd a fájl újboli megnyitása után azt akarnám, hogy soronként szóköz+1 elemet olvasok be szóköz karakterig, majd átkonvertálom int-be. (Majd eldöntés tételt kell alkalmaznom). De valahogy nem sikerül. Gyanítom, hogy ott bukik el a dolog, hogy a beolvasandó számokat szóköz karakterik olvasom be getline-nal, viszont a sor utolsó eleménél ez elbukik. 

Itt a kódom lényegi része:

string adat1; befile.open(seged.c_str()); while(!befile.eof()) { getline(befile,adat1,' '); db++; } befile.close(); string file = "be.txt"; befile.open(file.c_str()); int i = 0; int adat2; while(!befile.eof()) { while (i<db) { i++; getline(befile,adat1,' '); cout << adat1 << endl; adat2 = atoi(adat1.c_str()); cout << adat2 << endl; } if (i>=db) { i = 0; } }
Mutasd a teljes hozzászólást!
Akkor talán stringstream-mel?

int sordb= 0; string line; while (getline(cin,line)) { stringstream sline; sline<<line; int db= 0; while (sline>>adat) { printf ("%d\n", adat); ++db; } printf ("Ebben a sorban %d szám volt\n", db); } printf ("Itt a vége, sordb=%d\n", sordb);
Mutasd a teljes hozzászólást!

  • Esetleg így:

    int adat; while (befile>>adat) { /* 'adat' feldolgozása */ }
    Szerk: bár így nem értesülsz az egyes sorokról, hanem szépen sorban kapod az összes számot. Ha így nem jó, akkor másképp kell.
    Mutasd a teljes hozzászólást!
  • Ez így sajnos nem lesz jó, mert azt kell majd eldöntenem, hogy van-e olyan sor, ahol nincsen 0 szám, ehhez pedig egyesével kell vizsgáljam a sorok elemeit.
    Mutasd a teljes hozzászólást!
  • Akkor talán stringstream-mel?

    int sordb= 0; string line; while (getline(cin,line)) { stringstream sline; sline<<line; int db= 0; while (sline>>adat) { printf ("%d\n", adat); ++db; } printf ("Ebben a sorban %d szám volt\n", db); } printf ("Itt a vége, sordb=%d\n", sordb);
    Mutasd a teljes hozzászólást!
  • Nem optimális sok szempontból, de azért érdekes  megoldás boost x3

    #include <boost/spirit/home/x3.hpp> #include <vector> #include <iostream> #include <iterator> #include <string> #include <algorithm> namespace x3 = boost::spirit::x3; using x3::float_; using x3::eol; using x3::ascii::blank; using namespace std; const auto matrix_def = *( (float_ % blank) >> eol ); int main() { string input = "1 2 4\n3 4\n5\n"; vector<vector<float>> parsed; parse( input.begin(), input.end(), matrix_def, parsed); cout<<"Number of rows: "<<parsed.size()<<"\n"; for (const auto& row : parsed) { ranges::copy( row, ostream_iterator<float>(cout, " ")); cout<<"\n"; } }
    Tudom, hogy nem felel meg a feladatkiírásnak, de ha már megírtam, akkor bemásolom, hátha hasznos lesz még valakinek..
    Mutasd a teljes hozzászólást!
  • Ezt valahol a neten találtam. Sorról-sorra beolvas egy szövegfájlt.
    #include <iostream> #include <string> #include <fstream> using namespace std; int main () { ifstream inFile("C:\TestData\data.txt"); if(!inFile) { cout<<"Couldn't open the file"<<endl; exit(1); } string line; while( getline(inFile, line) ) { //do something with 'line' } ....

    A while ciklusban az elválasztó karakter alapján felbontod a sort, és a bontás eredményeit egyesével belerakod a tömbödbe, mátrixodba.
    A béna indent nem tudom miért van, pedig használtam a kódbeszúrás opciót....
    A szépen behúzott változatot itt megtalálod.
    Mutasd a teljes hozzászólást!
  • Egyébként furcsa, hogy ez a </kód> dolog nem működik nekem. Érdekes...
    Raktam volna ide egy  még szebb dolgot, de akkor most működés hiányában mégsem raktam.
    Mutasd a teljes hozzászólást!
  • Lopva a megoldást, feladat szerinti(bb) működéssel.

    constexpr auto print = [](auto& ctx) { std::cout << _attr(ctx) << ' '; }; constexpr auto print_new_line = [](auto&) { std::cout << '\n'; }; const auto matrix_def = (float_[print] % blank) % eol[print_new_line]; int main() { string input = "1 2 4\n3 4\n5\n"; parse( input.begin(), input.end(), matrix_def); }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd