c ++, kuidas faili massiiviks lugeda


Vastus 1:

C ++ kasutab failidele juurdepääsuks C-standardit I / O. Nii et C-kood töötab suurepäraselt.

C ++ -s on mõned toredad iostreami objektid, mis teevad sel moel hulga toredaid asju.

See aitab teada faili vormingut. Kas loete komadega piiratud numbreid, tühikutega eraldatud numbreid või üks rea kohta?

Teil on õigus, et need pole arvud, vaid numbriline tekst. Pärast nende lugemist peate teksti teisendama numbriteks. Teadmata, milliseid numbreid kasutage kõigi panuste katmiseks topelt.

Michael Bauersi vastus on hea, kuid puudub selgitus.

avatud fail loe tekst teisenda tekst numbriks lisa konteinerisse. sulgege fail

minu võtmine:

loo operaator failide arvude vektorisse sisestamiseks.

loo arvuvektor avatud fail rakendage operaator vektori täitmiseks sulgege failikasutusvektor

// loo operaator >> töötamiseks vektori ja istreamiga std :: istream & operaator >> (std :: istream & in, std :: vector & v){ topelt d; while (in >> d) // ifstream teeb teksti-> topelt teisendusev.push_back (d); // lisa vektorisse tagasitulek; // tagastab istream ise} // tee vektor, mis hoiab topeltstd: vektor minu numbrid;std :: ifstream inputFile {"file.txt"}; // {} on 'initsialistide loendi' süntaks while (inputFile)inputFile >> minu numbrid; // sisestage kõik numbrid kuni valmisinputFile.close (); // sulgege fail// nüüd on vektor laaditud, fail on suletud - valmis.

Lugemissilmus on funktsioonis operaator >>, seega on süntaks lühike, kuid väga loetav. Kõik läheb valesti (faili ei leitud, andmeid pole ...) ja ifstream puhastab end ise ja loob tõrke erandi, mille saate tabada või lasta programmil surra.


Vastus 2:

Küsimus: Kuidas saab tekstifaili numbreid lugeda massiiviks C ++ keeles?

Wow 3 vastusetaotlust kolmelt erinevalt inimeselt kõik selle sama küsimuse kohta. Veider! Peaaegu tundub midagi sellist, mida keegi oleks võinud Quora kohta küsimise asemel vastuse määramiseks guugeldada. Mul pole vaja googeldada - ma saan koodi kirjutada mälust ja mõttest:

# kaasata # kaasata # kaasata nimeruumi kasutamine std;int main (int argc, char ** argv){ ifstream sisse ("file.txt", ifstream :: in);vektor lstNumbrid; samas ((!! e. ()) && sisse { int iNumber = 0; sisse >> iNumber; lstNumbers.push_back (iNumber); } sisse.sulge (); // Mida soovite nende numbritega teha ???}

Ok, ma valetasin - pidin Google'i vektoriklassi C ++ viite googeldama, sest ausalt öeldes ei kasuta ma seda kunagi. Töötan QT raamistikuga, millel on kõigi andmestruktuuride (loend, kaart, komplekt jne) jaoks oma klassid. Lisaks ei tööta ma tavaliselt faili I / O-ga - töötan Javas peamiselt professionaalselt ja isegi seal ei tööta ma failidega, välja arvatud JSON- ja XML-failid, ja nende jaoks on raamatukogusid, mis abstraktselt programmeerija jaoks asju abstraktsed nii et ei pea muretsema faili avamise, sulgemise ega lugemise pärast. Kuid see peaks teie jaoks trikki tegema, ma usun.

Ma ei testinud seda - lihtsalt selguse huvides - üks muudatusest, mida võiksin teha, on pakkida failikood try / catch ploki sisse, kuid kuna C ++ on Java osas erandite osas vähem analoogne, ei teinud ma seda siin. Try / catch peataks ebameeldivate vigade ilmumise isegi faili avamisel või sulgemisel - see sisaldab nii-öelda viga.


Vastus 3:

Midagi sellist.

Üldiselt mulle ei meeldi stiil, kuidas intse otse failist lugeda. Ma kipun lugema rida korraga, seejärel sõeluma rida. Ma tunnistan, et ma pole kunagi 100% kindel numbrite otsese lugemise käitumises, näiteks mis juhtub, kui sekkub asju, mis pole numbrid.

Kui see pole massiive nõudev projekt, kasutaksin vektorit. Massiivide suurust ei muudeta ja programmide kirjutamine fikseeritud puhvritega on viga ja võin seda tõestada, rääkides teile kõigist aegadest, kus ma põlen, arvates, et olen teinud suurima suuruse piisavalt suureks (ma ei tee seda, kuid oli kordi .)

# kaasata # kaasata # kaasata # kaasata nimeruumi kasutamine std;int main () { ifstream myfile ("d: \\ numbrid.txt"); kui (myfile.is_open ()) { int arrSize = 0;massiiv arr; // Ideaalis oleks see vektor, aga sa ütlesid massiivi samas (tõsi) { int x; minufail >> x; kui (myfile.eof ()) murda; arr [arrSize ++] = x; } for (int i = 0; i cout << arr [i] << ""; cout << endl; // Ma oleksin pidanud siin faili sulgema, kuid kuna programm lõppes, olin laisk} muud { cout << "Faili ei õnnestu avada"; } tagastus 0;}

Vastus 4:

Kui olete kindel, et fail sisaldab ainult numbreid, mida soovite lugeda, ja olete piisavalt mõistlik käsitlema massiivi abstraktse kontseptsioonina, selle asemel, et viidata konkreetselt massiivi-asjale, mille C ++ pärandas C-lt, võib see olema vektori initsialiseerimiseks üsna mõistlik (või vektor jne) failist umbes nii:

std :: ifstream sisend (“numbrid.txt”);std: vektor numbrid {std :: istream_iterator (sisend), {}};

(„T” = mis tahes tüüpi, mida soovite lugeda - int, topelt, ujuk jne)

Kui teie fail võib numbrite vahel sisaldada täiendavat rämpsposti, võite soovi korral ikkagi teha sama. Istream_iterator on põhimõtteliselt adapter, mis kasutab voost üksuste lugemiseks operaatorit >>. See ignoreerib omakorda tühimikku, nii et midagi sellist nagu „1 2 "loetakse järgmiselt 1 ja 2.

Kuid siin on üks koht, kus iostreams on tegelikult üsna korralikult kujundatud: iostream ei määra (ise), mis on tühimik. Selle asemel delegeerib ta selle oja lokaadile.

Kui me tahame eirata täiendavat rämpsu voos (nt kõike, mis pole number), saame määratleda lokaadi, mis ütleb, et kõik muu on tühimik, siis lugege lihtsalt voost meie numbreid.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} staatiline standard: ctype_base :: mask const * get_table () { // kõigepealt looge tabel, mis ütleb, et kõik on tühik: staatiline std: vektor rc (std :: ctype :: tabeli_suurus, std :: ctype_base :: tühik); // siis määrake numbrid tegelikeks numbriteks: kui (rc ['0'] == std :: ctype_base :: tühik) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // tagastab tabeli märkide liigitamiseks vastavalt: tagasi & rc [0]; }};

Seejärel käskime voogel kasutada seda lokaati ja loeme voost andmeid:

int main () { std :: istringstream sisend (R "(11 rämps 1,00 rohkem rämps 16,0 veel rämps 1,999! @ # $$% ^ $% & * lõpuks tehtud)"); input.imbue (std :: locale (std :: locale (), ainult uued numbrid_ainult));std: vektor numbrid {std :: istream_iterator (sisend), {}};}

Kuna lokaat ütleb, et kõik, välja arvatud number, on tühik, käsitletakse kogu numbritevahelist lisavarustust tühimikuna (st vaikselt eiratakse), nii et saame lihtsalt numbrid.


Vastus 5:

Txt-faili numbreid saate lugeda järgmise koodi abil.

# kaasata

# kaasata

# kaasata

tühine main ()

{char ch; int a; int arr [[30]; int i = 0;

ifstream f1 (“abc.txt”);

samas (! f1.eof ())

{

fi >> ch;

a = staatiline_ülekanne ch;

arr [i] = a;

}

f1.sulge ();

getch ();

}

See programm loeb tekstifaili, mis eeldatavasti on tehtud juba enne seda programmi, kuna fail on txt-vormingus, nii et me salvestame ühe arvu muutujale char, kuna char-tüüpi muutuja suudab märke salvestada ja seejärel kasutame funktsiooni static_cast () valage tähemärgi väärtus täisarvu sisestatud väärtuseks ja sisestage see int a-sse ning seejärel kasutame muutujat, et selle väärtus ükshaaval massiivi salvestada.

Aitäh …..


Vastus 6:

Ma ei kirjuta koodi, kuid selgitan kõige paremini. Kasutades ifstreami päist, soovite luua tsükli, kuni teie ifstream-objektist leitakse EOF (faili lõpp). Silmuse ajal lugege iga tekstirida stringimuutujaks. Jagage (märkige) iga string tühikutega eraldatud osadeks. Testige iga osa (märgi) puhul, kas seda saab teisendada täisarvuks - kui see on võimalik, siis lisage see oma loendisse, vastasel juhul minge järgmisele. Nii et sisuliselt on teil väline silmus, mis saab tekstiread, ja sisemine silmus, mis jagab iga tekstirea osadeks ja proovib sellest numbrit luua.

Kui olete päästnud sisemise ja välimise silmuse viimasest kordusest, on teil olemas nimekiri, millega saate kõike teha.


Vastus 7:

Oletame, et teil on fail nimega input.txt, saate failist täisarvude lugemiseks kasutada järgmisi koodijuppe. Loodan, et see aitab :-)

# kaasata nimeruumi kasutamine std;const int sz = 1001; // määrake sz massiivi maksimaalseks suuruseksint massiiv [sz];int main (){ freopen ("sisend.txt", "r", stdin); int indeks = 0, arv; /// skannimine kuni faili lõpuni while (scanf ("% d", & num) == 1) { massiiv [indeks ++] = arv; } jaoks (int i = 0; i printf ("% d", massiiv [i]); printf ("\ n"); tagastus 0;}

Vastus 8:

Võiksite hakata õppima programmeerimist ...

Nii et tekstifail sisaldab numbreid (ASCII 48..57, võib-olla 'e' ja '-' ning '.') Ja eraldajaid (ASCII 13,10,9,32, mis iganes su mürk ka pole).

Seega eraldate massiivi piisavalt suure int-i, pika int-i ja hakkate seda asustama, parsides failibaidi baidi või stringi kaupa järgmise eraldajani.

Teate, miks on minu palk kõrge? Põhjus, et tegin seda iseseisvalt, investeerisin palju aega ja tööandjad teavad seda.


Vastus 9:

Internetist peate leidma utiliidi, mis teisendab teie tekstifaili C-array'is. Kui teie tekstifail on kirjutatud, on csv-vorming (komaga eraldatud väärtused), arvan, et teil pole sellise utiliidi leidmisega probleeme. Teisisõnu, teie tekstifail peab vastama teadaolevale standardile, sellisel juhul saate selle hõlpsalt teisendada C-massiiviks.


Vastus 10:

Klassikaline C viis oleks fscanfi kasutamine

C ++ viis võib olla ifstream'i kasutamine koos stringstreamiga.

Teil pole võibolla isegi stringi vaja.