c ++ hogyan olvassunk egy fájlt tömbbe


Válasz 1:

A C ++ C szabványos I / O-t használ a fájlok eléréséhez. Tehát a C kód remekül fog működni.

A C ++ -nak vannak olyan szép iostream-objektumai, amelyek egy csomó szép dolgot csinálnak így.

Segít megismerni a fájl formátumát. Vesszővel megtakarított számokat, szóközzel elválasztva vagy soronként egyeket olvas?

Abban igazad van, hogy ezek nem számok, hanem numerikus szövegek. El kell olvasnia a szöveget számokká. Nem tudni, hogy milyen számok, használja a dupla az összes fogadás fedezésére.

Michael Bauers válasza jó, de nincs magyarázat.

fájl megnyitása szöveg olvasása szöveg konvertálása számgá konvertálás konténerbe. fájl bezárása

én veszem:

hozzon létre egy operátort a fájlok számok vektorba történő betáplálásához.

szám vektor létrehozása nyitott fájl alkalmazza az operátort a vektor kitöltéséhez bezárja a fájlt

// operátor létrehozása >> a vektorral és az istream-mel való együttműködéshez std :: istream & operator >> (std :: istream & in, std :: vector & v){ dupla d; míg (>> d-ben) // az ifstream szöveg-> kettős átalakítást hajt végrev.push_back (d); // hozzáadás a vektorhoz visszatérés; // visszaadja magát az istream-et} // készítsen vektort a duplák megtartásárastd :: vektor számok;std :: ifstream inputFile {"file.txt"}; // {} az 'inicializálási lista' szintaxisa while (inputFile)inputFile >> saját számok; // adja meg az összes számot, amíg készinputFile.close (); // zárja be a fájlt// most betöltődött a vektor, a fájl bezárult - kész.

Az olvasási ciklus az operátor >> függvényben található, így a szintaxis szűk, de nagyon olvasható. Minden rosszul megy (a fájl nem található, nincs adat ..), és az ifstream megtisztítja magát, és létrehoz egy hibahelyzetet, amelyet elkaphat, vagy hagyhatja, hogy a program meghaljon.


Válasz 2:

Kérdés: Hogyan olvashatok el egy szövegfájlban lévő számokat tömbbe C ++ nyelven?

Wow 3 válaszkérés 3 különböző embertől, ugyanazon a kérdésen. Furcsa! Szinte úgy tűnik, mintha valami guglizhatta volna a választ, hogy meghatározza a választ, ahelyett, hogy a Quoráról is kérdezte volna. Nem kell gugliznom - beírhatom a kódot a memóriából és az elmémből:

#include #include #include névtér használata std;int main (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);vektor lstNumbers; míg ((!! in.eof ()) && in { int iNumber = 0; a >> iNumber; lstNumbers.push_back (iNumber); } körülkerít(); // Mit szeretnél kezdeni ezekkel a számokkal ???}

Ok, hazudtam - a Google osztály C ++ referenciáját kellett gugliznom, mert őszintén szólva soha nem használom. A QT keretrendszerrel dolgozom, amelynek saját osztályai vannak az összes adatstruktúrához (lista, térkép, halmaz stb.). Ezenkívül általában nem dolgozom a File I / O-val - elsősorban a Java-ban dolgozom professzionálisan, és még ott sem dolgozok olyan fájlokkal, mint a JSON és az XML fájlok, és vannak olyan könyvtárak, amelyek elvonják a dolgokat a programozó számára így nem kell aggódnia a fájlok kinyitása, bezárása vagy elolvasása miatt. De ennek meg kell csinálnia a trükköt helyetted.

Nem teszteltem ezt - csak azért, hogy világossá váljon - Az egyik változtatás, amit tehetek, az, hogy a fájl kódot egy try / catch blokkba csomagolom, de mivel a C ++ kevésbé analitikus a Java kivételével, ezért itt nem tettem meg. A try / catch megakadályozná a bosszantó hibák megjelenését a fájl megnyitásakor vagy bezárásakor is - úgymond tartalmazva a hibát.


Válasz 3:

Valami ilyesmi.

Általában nem szeretem azt a stílust, hogy a fájlokat közvetlenül fájlokból olvasom. Hajlamos vagyok egyszerre sort olvasni, majd elemezni a sort. Elismerem, hogy soha nem vagyok 100% -ban biztos a számok közvetlen olvasásának viselkedésében, például abban, hogy mi történik, ha vannak olyan közbeiktatott dolgok, amelyek nem számok.

Hacsak nem tömböket igénylő projektről van szó, vektort használnék. A tömbök nem méreteznek át, és a programok rögzített pufferekkel való írása hiba, és ezt be tudom bizonyítani azzal, hogy elmondok minden alkalommal, amikor megégtem, és azt gondoltam, hogy a maximális méretet elég nagyra tettem (nem fogom, de voltak esetek .)

#include #include #include #include névtér használata std;int main () { ifstream myfile ("d: \\ számok.txt"); if (myfile.is_open ()) { int arrSize = 0;sor arr; // Ideális esetben ez vektor lenne, de te tömböt mondtál míg (igaz) { int x; saját fájl >> x; if (myfile.eof ()) szünet; arr [arrSize ++] = x; } for (int i = 0; i cout << arr [i] << ""; cout << endl; // itt kellett volna bezárnom a fájlt, de mivel a program véget ért, lusta voltam} más { cout << "Nem lehet megnyitni a fájlt"; } visszatér 0;}

Válasz 4:

Ha biztos abban, hogy a fájl csak azokat a számokat tartalmazza, amelyeket el akar olvasni, és elég értelmes ahhoz, hogy a „tömböt” elvont fogalomként kezelje, ahelyett, hogy kifejezetten a C ++ C-től örökölt tömb-dologra hivatkozna, akkor legyen elég ésszerű egy vektor inicializálásához (vagy vektor , stb.) egy ilyen fájlból:

std :: ifstream bemenet („számok.txt”);std :: vektor számok {std :: istream_iterator (bevitel), {}};

(„T” = bármilyen típusú, amit olvasni szeretne - int, double, float stb.)

Ha a fájlja tartalmazhat extra „szemetet” a számok között, akkor továbbra is általában ugyanazt teheti, ha akarja. Az istream_iterator alapvetően egy illesztő, amely >> operátort használ az elemek leolvasására a patakból. Ez viszont figyelmen kívül hagyja a szóközöket, tehát valami olyasmi, mint az „1 2 "szövege 1-nek, majd 2-nek fog olvasni.

De itt van az egyik olyan hely, amelyet az iostream valójában meglehetősen tisztességesen megtervezett: az iostream nem (maga) határozza meg, mi az a szóköz. Ehelyett ezt delegálja a patak területi beállítására.

Ha figyelmen kívül akarjuk hagyni az adatfolyamban levő extra szemetet (pl. Mindent, ami nem egy számjegy), meghatározhatunk egy olyan területi beállítást, amely szerint minden más szóköz, majd csak olvassa el a számainkat a patakból.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} statikus std :: ctype_base :: mask const * get_table () { // először hozzon létre egy táblázatot, amely szerint minden szóköz: statikus std :: vektor rc (std :: ctype :: table_size, std :: ctype_base :: space); // ezután állítsa be a számjegyeket tényleges számjegyekként: if (rc ['0'] == std :: ctype_base :: szóköz) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // adja vissza a táblázatot a karakterek megfelelő osztályozásához: visszatérés & rc [0]; }};

Ezután azt mondjuk a pataknak, hogy használja ezt a területi beállítást, és olvassa el az adatokat a streamből:

int main () { std :: istringstream bemenet (R "(11 szemét 1,00 több-szemét 16,0 még több szemét 1,999! @ # $$% ^ $% & * végre elkészült)"); input.imbue (std :: locale (std :: locale (), új számjegy_csak));std :: vektor számok {std :: istream_iterator (bevitel), {}};}

És mivel a területi beállítás szerint egy számjegy kivételével minden szóköz, akkor a számok közötti összes plusz „cuccot” szóközként kezeljük (azaz csendben figyelmen kívül hagyjuk), így csak megkapjuk a számokat.


Válasz 5:

A txt fájlban lévő számokat a következő kóddal olvashatja el.

#include

#include

#include

void main ()

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

ifstream f1 („abc.txt”);

míg (! f1.eof ())

{

fi >> ch;

a = statikus_cast ch;

arr [i] = a;

}

f1.zárja ();

getch ();

}

Ez a program egy szövegfájlt olvas, amely feltételezhető, hogy már a program előtt elkészült, mivel a fájl txt formátumban van, így egy számot eltárolunk a char változóba, mivel a char tipizált változó karaktereket tárolhat, majd a static_cast () függvényt használjuk a öntsd a karakter értékét egész gépelt értékbe, és tedd az int a-ba, majd egy változó segítségével egyenként tároljuk az értékét tömbbe.

Köszönöm …..


Válasz 6:

Nem írom a kódot, de a lehető legjobban elmagyarázom. Az ifstream fejléc használatával addig szeretne ciklusolni, amíg az EOF (a fájl vége) megtalálható az ifstream objektumon. Hurkolás közben olvassa el az egyes szövegsorokat egy string változóba. Az egyes húrokat szétválasztva (tokenizálva) szóközökkel elválasztva. Minden egyes részhez (token) tesztelje, hogy átalakítható-e egész számra - ha igen, akkor vegye fel a listájába, különben ugorjon a következőre. Tehát lényegében egy külső hurkot kap, amely szövegsorokat kap, és egy belső hurkot, amely az egyes szövegsorokat részekre bontja, és megpróbál egy számot létrehozni belőle.

Miután kimentetted a belső és külső hurok utolsó iterációját, van egy listád, amivel bármit megtehetsz.


Válasz 7:

Tegyük fel, hogy van egy fájlod, nevezetesen az input.txt fájl. A következő kódrészletek segítségével egész számokat olvashat a fájlból. Remélem ez segít :-)

#include névtér használata std;const int sz = 1001; // állítsa a sz-t a tömb max méretéreint tömb [sz];int main (){ freopen ("input.txt", "r", stdin); int index = 0, szám; /// szkennelés a fájl végéig while (scanf ("% d", & num) == 1) { tömb [index ++] = szám; } mert (int i = 0; i printf ("% d", tömb [i]); printf ("\ n"); visszatér 0;}

Válasz 8:

Szeretne elkezdeni megtanulni programozni ...

Tehát a szöveges fájl tartalmaz számjegyeket (ASCII 48..57, talán 'e' és '-' és '.') És elválasztókat (ASCII 13,10,9,32, bármi is legyen a méreg).

Tehát kioszt egy elég nagy int-t, hosszú int-ot bármilyen tömbből, és elkezdi azt feltölteni, miközben a fájl byte-ját byte-onként vagy string-enként stringenként elemzi a következő elválasztóig.

Tudod, miért magas a fizetésem? Mert ezt egyedül csináltam, sok időt fektettem be, és a munkaadók tudják ezt.


Válasz 9:

Meg kell találni egy segédprogramot az interneten, amely átalakítja a szöveges fájlt a C-tömbben. Ha a szöveges fájlod csv formátumú (vesszővel elválasztott értékek), akkor azt hiszem, nem okoz gondot egy ilyen segédprogram megtalálása. Más szavakkal, a szöveges fájljának meg kell felelnie egy ismert szabványnak, ebben az esetben könnyen átalakíthatja C-tömbgé.


Válasz 10:

A klasszikus C módszer az fscanf használata lenne

C ++ módszer lehet az ifstream használata a stringstream-mel együtt.

Lehet, hogy nem is kell a stringstream.