c ++ hvernig á að lesa skrá í fylki


svara 1:

C ++ notar C staðlaðan I / O til að fá aðgang að skrám. Svo C kóði mun virka bara fínt.

C ++ er með nokkra fína iostream hluti sem gera fullt af fallegu efni á þennan hátt.

Það hjálpar að þekkja snið skráarinnar. Ertu að lesa kommur dreifðar tölur, bil aðskilin eða ein lína?

Það er rétt hjá þér að það eru ekki tölur, heldur tölulegur texti. Þú verður að breyta textanum í tölur eftir að hann er lesinn. Ekki vita hvers konar tölur, notaðu tvöfalt til að hylja öll veðmál.

Svar Michael Bauers er gott en skortir skýringar.

opna skrá lesa texta umbreyta texta í fjölda bæta við ílát. loka skrá

mín taka:

búið til rekstraraðila til að færa tölur úr skrá í vektor.

búa til númer vektor opna skrá beita stjórnanda til að fylla vektor loka skrá nota vektor

// búa til rekstraraðila >> til að vinna með vektor og istream std :: istream & stjórnandi >> (std :: istream & in, std :: vector & v){ tvöfaldur d; meðan (í >> d) // ifstream gerir texta-> tvöfalda umbreytinguv.push_back (d); // bæta við vektor snúa aftur inn; // skilar istream sjálfum} // búa til vektor til að halda tvöföldumstd :: vektor fjöldinn minn;std :: ifstream inputFile {"file.txt"}; // {} er setningafræði „upphafsskrá“ meðan (inputFile)inputFile >> fjöldinn minn; // sláðu inn allar tölur þar til lokiðinputFile.close (); // lokaðu skránni// nú er vektor hlaðinn, skráin lokuð - tilbúin.

Leslykkjan er í stjórnandanum >> virka, þannig að setningafræði er stutt en mjög læsileg. Allt fer úrskeiðis (skrá fannst ekki, engin gögn ..) og ifstream hreinsar sig upp og býr til undantekningartilvik sem þú getur náð eða látið forritið deyja.


svara 2:

Spurning: Hvernig get ég lesið tölur í textaskrá inn í fylki í C ++?

Vá 3 svar beiðnir frá 3 mismunandi fólki öllum um þessa alveg sömu spurningu. Skrýtið! Virðist næstum eins og eitthvað gæti einhver hafa googlað til að ákvarða svarið í stað þess að spyrja á Quora líka. Ég þarf ekki að gúggla - ég get skrifað kóðann úr minni og huga minn:

# innifalið # innifalið # innifalið að nota namespace std;int aðal (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);vektor lstNúmer; meðan ((! in.eof ()) && in) { int iNumber = 0; í >> iNumber; lstNumbers.push_back (iNumber); } in.close (); // Hvað viltu gera við þessar tölur ???}

Ok, ég laug - ég þurfti að googla C ++ tilvísunina fyrir vektorflokkinn því satt að segja nota ég það aldrei. Ég vinn með QT ramma sem hefur sína eigin flokka fyrir alla gagnagerðina (listi, kort, mengi osfrv.). Að auki vinn ég venjulega ekki með File I / O - ég vinn í Java fyrst og fremst faglega og jafnvel þar vinn ég ekki með skrár nema eins og JSON og XML skrár og fyrir þá eru bókasöfn sem draga hlutina út fyrir forritarann. svo maður þarf ekki að hafa áhyggjur af því að opna, loka eða lesa hluti úr skránni. En þetta ætti að gera bragðið fyrir þig að ég tel.

Ég prófaði þetta ekki - bara til að koma því á hreint - Ein breyting sem ég gæti gert er að vefja skráarkóðann inni í try / catch blokk en þar sem C ++ er minna endaþarmur um undantekningar eins og Java, þá gerði ég það ekki hér. Reynsla / afli myndi stöðva leiðinlegar villur frá því að birtast, jafnvel þegar skjalið er opnað eða lokað - sem inniheldur villuna ef svo má segja.


svara 3:

Eitthvað eins og þetta.

Almennt líst mér ekki á stílinn við að lesa blek beint úr skrá. Ég hef tilhneigingu til að lesa línu í einu og flokka síðan línuna. Ég viðurkenni að ég er aldrei 100% viss um hegðun þess að lesa tölur beint, eins og til dæmis hvað gerist ef hlutir eru íhlutun sem eru ekki tölur.

Nema þetta sé verkefni sem krefst fylkja myndi ég nota vektor. Stærð breytist ekki og að skrifa forrit með föstum biðminni er mistök og ég get sannað það með því að segja þér frá öllum þeim stundum sem ég brenndist við að hugsa um að ég hefði gert hámarksstærðina nógu stóra (ég mun ekki, en það voru stundum .)

# innifalið # innifalið # innifalið # innifalið að nota namespace std;int aðal () { ifstream myfile ("d: \\ numbers.txt"); ef (myfile.is_open ()) { int arrSize = 0;fylki arr; // Helst væri þetta vektor, en þú sagðir fylki meðan (satt) { int x; myfile >> x; ef (myfile.eof ()) brjóta; arr [arrSize ++] = x; } fyrir (int i = 0; i cout << arr [i] << ""; cout << endl; // Ég hefði átt að loka skránni hér en þar sem forritinu var að ljúka var ég latur} Annar { cout << "Gat ekki opnað skrána"; } skila 0;}

svara 4:

Ef þú ert viss um að skráin inniheldur aðeins tölur sem þú vilt lesa og þú ert nógu skynsamur til að meðhöndla „array“ sem abstrakt hugtak, frekar en að vísa sérstaklega til array-hlutarins sem C ++ erfði frá C, þá getur það verið nokkuð sanngjarnt að frumstilla vektor (eða vektor , osfrv.) úr skrá eitthvað á þessa leið:

std :: ifstream inntak (“numbers.txt”);std :: vektor tölur {std :: istream_iterator (inntak), {}};

(fyrir „T“ = hvaða tegund sem þú vilt lesa — int, tvöfalt, fljóta osfrv.)

Ef skráin þín gæti innihaldið aukið „rusl“ á milli tölanna geturðu samt almennt gert það sama ef þú vilt. Istream_iterator er í grundvallaratriðum millistykki sem notar stjórnanda >> til að lesa hluti úr straumnum. Það hunsar aftur á móti hvít svæði, svo eitthvað eins og `1 2 'verður lesið sem 1 og síðan 2.

En hér er einn af þeim stöðum sem iostreams er í raun nokkuð sæmilega hannaður: iostream ákvarðar ekki (sjálft) hvað er hvítt rými. Þess í stað framselur það það til staðarins.

Ef við viljum hunsa aukið rusl í straumnum (td allt sem ekki er stafur) getum við skilgreint landsvæði sem segir að allt annað sé hvítt rými, þá er bara að lesa tölurnar okkar úr straumnum.

struct tölustafir eingöngu: std :: ctype {tölustafir (aðeins): std :: tegund (get_table ()) {} truflanir std :: ctype_base :: gríma const * get_table () { // fyrst skaltu búa til töflu sem segir að allt sé hvítt bil: truflanir std :: vektor rc (std :: ctype :: borð_stærð, std :: ctype_base :: rúm); // stilltu tölustafina sem raunverulega tölustafi: ef (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // skila töflunni til að flokka stafi í samræmi við það: skila & rc [0]; }};

Við segjum síðan straumnum að nota þetta svæði og lesa gögn úr straumnum:

int aðal () { std :: istringstream input (R "(11 rusl 1,00 meira-rusl 16,0 enn meira rusl 1,999! @ # $$% ^ $% & * loksins búið)"); input.imbue (std :: locale (std :: locale (), nýir tölustafir_ eingöngu));std :: vektor tölur {std :: istream_iterator (inntak), {}};}

Og þar sem staðhæfingin segir að allt nema tölustafur sé hvítt, þá verður farið með öll „dótið“ á milli tölanna eins og hvítt bil (þ.e. þegjandi hunsað) svo við fáum bara tölurnar.


svara 5:

Þú getur lesið tölurnar í txt skrá með eftirfarandi kóða.

# innifalið

# innifalið

# innifalið

ógilt aðal ()

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

ifstream f1 („abc.txt“);

meðan (! f1.eof ())

{

fi >> ch;

a = static_cast ch;

arr [i] = a;

}

f1.close ();

getch ();

}

Þetta forrit les textaskrá sem gert er ráð fyrir að sé þegar gerð fyrir þetta forrit, þar sem skráin er á txt sniði svo við munum geyma eina tölu í char breytu þar sem char tegundar breytu getur geymt stafi og þá munum við nota static_cast () virka til kastaðu stafagildinu í heiltölu slegið gildi og settu það í int a og þá munum við nota breytu til að geyma gildi þess í fylki eitt af öðru.

Þakka þér fyrir …..


svara 6:

Ég mun ekki skrifa kóðann en ég mun útskýra það besta sem ég get. Notaðu ifstream hausinn og þú vilt lykkja þar til EOF (lok skráar) er að finna á ifstream hlutnum þínum. Á meðan lykkja er lesið hverja línu af texta í strengbreytu. Skiptu (tokenize) hverjum streng í hluta aðskilin með bilum. Fyrir hvern hluta (tákn), prófaðu hvort hægt sé að breyta honum í heiltölu — ef hann getur það, bættu því síðan við listann þinn, annars skaltu fara yfir í næsta. Svo í raun og veru verður þú með ytri lykkju sem fær línur af texta og innri lykkju sem brýtur hverja línu af texta í hluta og reynir að búa til tölu úr henni.

Þegar þú ert búinn að bjarga þér frá síðustu endurtekningu á innri og ytri lykkjunum hefurðu lista sem þú getur gert hvað sem er með.


svara 7:

Segjum að þú hafir skrá, þ.e. input.txt, þú getur notað eftirfarandi kóðabút til að lesa heiltölur úr skránni. Vona að það hjálpi :-)

# innifalið að nota namespace std;const int sz = 1001; // stilltu sz í hámarksstærð fylkisinsint fylki [sz];aðal aðal (){ freopen ("input.txt", "r", stdin); int vísitala = 0, num; /// skanna til loka Skrár meðan (scanf ("% d", & num) == 1) { fylki [index ++] = num; } fyrir (int i = 0; i prentf ("% d", fylki [i]); prentf ("\ n"); skila 0;}

svara 8:

Þú gætir viljað byrja að læra að forrita ...

Þannig að textaskráin inniheldur tölustafi (ASCII 48..57, kannski 'e' og '-' og '.') Og skiljur (ASCII 13,10,9,32, hvað sem eitrið þitt er).

Þannig að þú úthlutar nógu stóru int, löngu inti hvaða fylki sem er og byrjar að fylla það meðan þú flokkar skráarbæti fyrir bæti eða streng fyrir streng þar til næsta aðskilnaður.

Þú veist af hverju launin mín eru há? Vegna þess að ég gerði þetta á eigin spýtur, fjárfesti mikinn tíma og vinnuveitendur vita þetta.


svara 9:

Þú þarft að finna tól á internetinu sem umbreytir textaskránni þinni í C-array. Ef textaskráin þín er skrifuð er með csv sniði (kommu aðskilin gildi), þá held ég að þú eigir ekki í neinum vandræðum með að finna slíkt tól. Með öðrum orðum, textaskráin þín verður að vera í samræmi við þekktan staðal, í þessu tilfelli breytirðu henni auðveldlega í C-array.


svara 10:

Klassíska C leiðin væri að nota fscanf

A ++ + leið gæti verið að nota ifstream ásamt stringstream.

Þú gætir ekki einu sinni þurft strengstreymið.