c ++ kako čitati datoteku u niz


Odgovor 1:

C ++ koristi C standardni I / O za pristup datotekama. Dakle, C kod će raditi sasvim u redu.

C ++ ima nekoliko lijepih iostream objekata koji na ovaj način rade hrpu lijepih stvari.

Pomaže znati format datoteke. Čitate li zarezima razdvojene brojeve, razmak ili jedan po retku?

U pravu si da to nisu brojevi, već numerički tekst. Tekst ćete trebati pretvoriti u brojeve nakon što ih pročitate. Ne znajući kakve brojeve upotrijebite double kako biste pokrili sve oklade.

Michael Bauers odgovor je dobar, ali nema objašnjenja.

otvori datoteku pročitaj tekst pretvori tekst u broj dodaj u spremnik. zatvori datoteku

moj stav:

stvoriti operator za unošenje brojeva iz datoteke u vektor.

stvori vektor broja otvori datoteku primijeni operator za popunjavanje vektora zatvori datoteku koristi vektor

// stvorimo operator >> za rad s vektorima i istreamom std :: istream & operator >> (std :: istream & in, std :: vector & v){ dvostruki d; while (u >> d) // ifstream radi tekst-> dvostruku pretvorbuv.push_back (d); // dodaj u vektor povratak u; // vraća sam istream} // napraviti vektor za zadržavanje parovastd :: vektor moji brojevi;std :: ifstream inputFile {"file.txt"}; // {} je sintaksa 'popisa inicijalizacije' while (inputFile)inputFile >> moji brojevi; // unesite sve brojeve dok ne završiteinputFile.close (); // zatvorite datoteku// sada je vektor učitan, datoteka je zatvorena - spremna.

Petlja čitanja nalazi se u funkciji operator >>, tako da je sintaksa kratka, ali vrlo čitljiva. Sve pođe po zlu (datoteka nije pronađena, nema podataka ..), a ifstream se čisti i generira iznimku kvara koju možete uhvatiti ili pustiti da program umre.


Odgovor 2:

Pitanje: Kako mogu pročitati brojeve iz tekstualne datoteke u niz u C ++?

Wow 3 zahtjeva za odgovor od 3 različite osobe na sve ovo isto pitanje. Čudno! Gotovo se čini kao nešto što je netko mogao guglati kako bi odredio odgovor, umjesto da ga pitaju i na Quori. Ne trebam guglati - mogu napisati kod iz sjećanja i uma:

#include #include #include pomoću prostora imena std;int glavni (int argc, char ** argv){ ifstream u ("file.txt", ifstream :: in);vektor lstNumbers; dok ((! in.eof ()) && in) { int iNumber = 0; u >> iNumber; lstNumbers.push_back (iNumber); } in.close (); // Što želite učiniti s ovim brojevima ???}

Ok, lagao sam - morao sam proguglati referencu C ++ za vektorsku klasu, jer je iskreno nikad ne koristim. Radim s QT okvirom koji ima svoje klase za sve strukture podataka (popis, karta, skup itd.). Uz to, obično ne radim s I / O datotekama - u Javi radim prvenstveno profesionalno, čak i tamo ne radim s datotekama, osim kao što su JSON i XML datoteke, a za one postoje knjižnice koje programeru apstrahiraju stvari tako da se ne treba brinuti otvoriti, zatvoriti ili pročitati dijelove iz datoteke. Ali ovo bi trebalo učiniti trik za vas, vjerujem.

Nisam ovo testirao - samo da razjasnimo - Jedna promjena koju bih mogao napraviti jest umotavanje koda datoteke u blok try / catch, ali budući da je C ++ manje analitičan prema iznimkama kao Java, nisam ovdje. Pokušaj / ulov zaustavio bi pojavljivanje dosadnih pogrešaka čak i prilikom otvaranja ili zatvaranja datoteke - tako da sadrži grešku.


Odgovor 3:

Nešto kao ovo.

Općenito, ne sviđa mi se stil čitanja intova izravno iz datoteke. Sklon sam čitanju retka odjednom, a zatim raščlanjivanju retka. Priznajem da nikada nisam 100% siguran u ponašanje izravnog čitanja brojeva, poput onoga što se događa ako postoje posredne stvari koje nisu brojevi.

Ako ovo nije projekt koji zahtijeva nizove, koristio bih vektor. Nizovi se ne mijenjaju, a pisanje programa s fiksnim međuspremnicima je pogreška, a to mogu dokazati govoreći vam o svim vremenima kad sam se opekao misleći da sam maksimalnu veličinu napravio dovoljno velikom (neću, ali bilo je vremena .)

#include #include #include #include pomoću prostora imena std;int main () { ifstream moja datoteka ("d: \\ numbers.txt"); if (myfile.is_open ()) { int arrSize = 0;niz arr; // U idealnom slučaju ovo bi bio vektor, ali rekli ste niz dok (istina) { int x; myfile >> x; if (myfile.eof ()) pauza; arr [arrSize ++] = x; } za (int i = 0; i cout << arr [i] << ""; cout << endl; // Trebao sam ovdje zatvoriti datoteku, ali kako je program završavao, bio sam lijen} drugo { cout << "Nije moguće otvoriti datoteku"; } povratak 0;}

Odgovor 4:

Ako ste sigurni da datoteka sadrži samo brojeve koje želite pročitati i dovoljno ste razumni da "niz" tretirate kao apstraktni koncept, umjesto da se posebno pozivate na niz koji je C ++ naslijedio od C, onda to može biti prilično razumno inicijalizirati vektor (ili vektor itd.) iz datoteke otprilike ovako:

std :: ifstream ulaz (“numbers.txt”);std :: vektor brojevi {std :: istream_iterator (ulaz), {}};

(za "T" = koju god vrstu želite pročitati - int, double, float itd.)

Ako vaša datoteka može sadržavati dodatni "smeće" između brojeva, još uvijek možete učiniti istu stvar ako želite. Istream_iterator je u osnovi adapter koji koristi operator >> za čitanje stavki iz toka. To pak zanemaruje razmake, pa nešto poput `1 2` čitat će se kao 1 nakon čega slijedi 2.

Ali ovdje je jedno od mjesta na kojima je iostream zapravo prilično pristojno dizajniran: iostream ne (sam) određuje što je razmak. Umjesto toga, delegira to na lokalitetu streama.

Ako želimo zanemariti dodatni otpad u streamu (npr. Sve što nije znamenka), možemo definirati lokalizaciju koja kaže da je sve ostalo razmak, onda samo pročitajte naše brojeve iz streama.

struct digits_only: std :: ctype {znamenke_samo (): std :: ctype (get_table ()) {} statički std :: ctype_base :: maska ​​const * get_table () { // prvo stvorimo tablicu koja kaže da je sve razmak: statički std :: vektor rc (std :: ctype :: table_size, std :: ctype_base :: space); // zatim postavimo znamenke kao da zapravo jesu znamenke: if (rc ['0'] == std :: ctype_base :: razmak) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // vratimo tablicu da bismo klasificirali znakove prema tome: povratak & rc [0]; }};

Zatim kažemo streamu da koristi ovu lokalizaciju i čitamo podatke iz streama:

int main () { std :: istringstream input (R "(11 junk 1,00 more-junk 16,0 still more junk 1.999! @ # $$% ^ $% & * konačno gotovo)"); input.imbue (std :: locale (std :: locale (), nove znamenke_samo));std :: vektor brojevi {std :: istream_iterator (ulaz), {}};}

A budući da lokalizacija kaže da je sve osim znamenke razmak, sve dodatne "stvari" između brojeva tretirat će se kao razmaci (tj. Tiho se zanemaruju), tako da samo dobivamo brojeve.


Odgovor 5:

Brojeve u txt datoteci možete pročitati prema sljedećem kodu.

#include

#include

#include

void main ()

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

ifstream f1 ("abc.txt");

dok (! f1.eof ())

{

fi >> ch;

a = statični_cast CH;

arr [i] = a;

}

f1.close ();

getch ();

}

Ovaj program čita tekstualnu datoteku za koju se pretpostavlja da je već napravljena prije ovog programa, jer je datoteka u txt formatu, tako da ćemo pohraniti jedan broj u varijablu char kao što upisana varijabla char može pohraniti znakove, a zatim ćemo koristiti funkciju static_cast () za prebacite vrijednost znaka u cjelobrojnu upisanu vrijednost i stavite je u int a, a zatim ćemo upotrijebiti varijablu da jednu po jednu pohranimo njezinu vrijednost u niz.

Hvala vam …..


Odgovor 6:

Neću napisati kod, ali objasnit ću najbolje što mogu. Koristeći zaglavlje ifstream, htjeli biste petlju sve dok se EOF (kraj datoteke) ne pronađe na vašem objektu ifstream. Tijekom petlje pročitajte svaki redak teksta u varijablu niza. Podijelite (označite) svaki niz na dijelove odvojene razmacima. Za svaki dio (token) testirajte može li se pretvoriti u cijeli broj - ako može, dodajte ga na svoj popis, u suprotnom preskočite na sljedeći. Dakle, u osnovi ćete imati vanjsku petlju koja dobiva retke teksta i unutarnju petlju koja svaki redak teksta dijeli na dijelove i pokušava od njega stvoriti broj.

Nakon što se izvučete iz zadnje iteracije unutarnje i vanjske petlje, imate popis s kojim možete raditi sve.


Odgovor 7:

Recimo da imate datoteku, odnosno input.txt, možete koristiti sljedeće isječke koda za čitanje cijelih brojeva iz datoteke. Nadam se da pomaže :-)

#include pomoću prostora imena std;const int sz = 1001; // postavi sz na maksimalnu veličinu poljaint niz [sz];int main (){ freopen ("input.txt", "r", stdin); indeks int = 0, num; /// skeniraj do kraja datoteke while (scanf ("% d", & num) == 1) { niz [indeks ++] = num; } za (int i = 0; i printf ("% d", niz [i]); printf ("\ n"); povratak 0;}

Odgovor 8:

Mogli biste početi učiti kako programirati ...

Dakle, tekstualna datoteka sadrži znamenke (ASCII 48..57, možda 'e' i '-' i '.') I separatore (ASCII 13,10,9,32, što god je vaš otrov).

Tako dodijelite dovoljno velik int, long int bilo kojem nizu i počnete ga popunjavati dok raščlanjujete bajt po bajt ili niz po niz do sljedećeg separatora.

Znate zašto je moja plaća visoka? Jer ovo sam radio sam, uložio sam puno vremena i poslodavci to znaju.


Odgovor 9:

Na internetu morate pronaći uslužni program koji pretvara vašu tekstualnu datoteku u C-niz. Ako je vaša tekstualna datoteka napisana u CSV formatu (vrijednosti odvojene zarezom), mislim da nećete imati problema s pronalaženjem takvog uslužnog programa. Drugim riječima, vaša tekstualna datoteka mora odgovarati poznatom standardu, u ovom ćete je slučaju lako pretvoriti u C-niz.


Odgovor 10:

Klasični C način bio bi upotreba fscanfa

C ++ način može biti upotreba ifstream-a zajedno sa stringstream-om.

Možda vam neće trebati ni struna.