c ++ jak číst soubor do pole


Odpověď 1:

C ++ používá standardní I / O pro přístup k souborům. Takže C kód bude fungovat dobře.

C ++ má nějaké pěkné objekty iostream, které tímto způsobem dělají spoustu pěkných věcí.

Pomáhá znát formát souboru. Čtete čárkami oddělená čísla, oddělená mezerou nebo jeden za řádek?

Máte pravdu, že to nejsou čísla, ale číselný text. Po přečtení budete muset text převést na čísla. Nevíte, jaký druh čísel, použijte dvojnásobek k pokrytí všech sázek.

Odpověď Michaela Bauersa je dobrá, ale postrádá vysvětlení.

otevřít soubor přečíst text převést text na číslo přidat do kontejneru. zavřít soubor

můj názor:

vytvořit operátor, který přenese čísla ze souboru do vektoru.

vytvořit číslo vektor otevřít soubor použít operátor k vyplnění vektoru zavřít soubor použít vektor

// vytvořit operátor >> pro práci s vektorem a istream std :: istream & operator >> (std :: istream & in, std :: vector & v){ dvojité d; while (in >> d) // ifstream does text-> double conversionv.push_back (d); // přidat do vektoru vrátit se; // vrací samotný stream} // uděláme vektor, který bude obsahovat dvojnásobekstd :: vektor moje čísla;std :: ifstream inputFile {"file.txt"}; // {} je syntaxe „inicializačního seznamu“ while (inputFile)inputFile >> moje čísla; // zadejte všechna čísla, dokud nebudete hotoviinputFile.close (); // zavřít soubor// nyní je vektor načten, soubor je uzavřen - připraven.

Smyčka pro čtení je ve funkci operator >>, takže syntaxe je stručná, ale velmi čitelná. Cokoli se pokazí (soubor nebyl nalezen, žádná data ..) a ifstream se sám vyčistí a vygeneruje výjimku selhání, které můžete zachytit nebo nechat program zemřít.


Odpověď 2:

Otázka: Jak mohu číst čísla v textovém souboru do pole v C ++?

Páni 3 žádosti o odpověď od 3 různých lidí, všichni na tuto stejnou otázku. Zvláštní! Skoro se zdá, že někdo mohl googlit, aby určil odpověď, místo aby se zeptal také na Quoru. Nepotřebuji google - mohu napsat kód z paměti a mé mysli:

#zahrnout #zahrnout #zahrnout pomocí jmenného prostoru std;int main (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);vektor první čísla; while ((!! in.eof ()) && in) { int iNumber = 0; v >> iNumber; lstNumbers.push_back (iNumber); } přiložit(); // Co si přejete udělat s těmito čísly ???}

Ok, lhal jsem - musel jsem vygooglit odkaz na C ++ pro třídu vektorů, protože upřímně ji nikdy nepoužívám. Pracuji s rámcem QT, který má své vlastní třídy pro všechny datové struktury (seznam, mapa, sada atd.). Navíc normálně nepracuji s File I / O - pracuji v Javě primárně profesionálně a ani tam nepracuji se soubory kromě souborů JSON a XML a pro ty existují knihovny, které pro programátora abstrahují. takže se nemusíte starat o otevírání, zavírání nebo čtení kousků ze složky. Ale věřím, že by to pro vás mělo udělat trik.

Netestoval jsem to - jen aby bylo jasno - Jednou změnou, kterou bych mohl udělat, je zabalit kód souboru do bloku try / catch, ale protože C ++ je méně anální ohledně výjimek jako Java, tady jsem nebyl. Try / catch by zastavil otravné chyby, aby se objevily i při otevírání nebo zavírání souboru - tak řečeno obsahující chybu.


Odpověď 3:

Něco takového.

Obecně se mi nelíbí styl čtení ints přímo ze souboru. Mám tendenci číst řádek po čase a poté jej analyzovat. Přiznávám, že si nikdy nejsem 100% jistý chováním přímého čtení čísel, například tím, co se stane, pokud dojde k zásahu, který není číslem.

Pokud se nejedná o projekt vyžadující pole, použil bych vektor. Pole nemění velikost a psaní programů s pevnými vyrovnávacími paměti je chyba a mohu to dokázat tím, že vám povím o všech dobách, kdy jsem se spálil, když jsem si myslel, že jsem dostatečně zvětšil maximální velikost (nebudu, ale byly časy .)

#zahrnout #zahrnout #zahrnout #zahrnout pomocí jmenného prostoru std;int main () { ifstream myfile ("d: \\ numbers.txt"); if (myfile.is_open ()) { int arrSize = 0;pole arr; // V ideálním případě by to byl vektor, ale řekl jste pole while (true) { int x; myfile >> x; if (myfile.eof ()) přestávka; arr [arrSize ++] = x; } pro (int i = 0; i cout << arr [i] << ""; cout << endl; // Měl jsem tu soubor zavřít, ale když program skončil, byl jsem líný} jiný { cout << "Nelze otevřít soubor"; } návrat 0;}

Odpověď 4:

Pokud jste si jisti, že soubor obsahuje pouze čísla, která chcete přečíst, a jste natolik rozumní, abyste s „maticí“ zacházeli jako s abstraktním pojmem, spíše než s odkazem konkrétně na matici, kterou C ++ zdědilo od C, pak může být docela rozumné inicializovat vektor (nebo vektor atd.) ze souboru podobného typu:

std :: ifstream vstup („numbers.txt“);std :: vektor čísla {std :: istream_iterator (vstup), {}};

(pro „T“ = jakýkoli typ, který chcete číst - int, double, float atd.)

Pokud váš soubor může obsahovat další „haraburdí“ mezi čísly, můžete obecně udělat totéž, pokud chcete. Istream_iterator je v podstatě adaptér, který používá operátor >> ke čtení položek ze streamu. To zase ignoruje mezery, takže něco jako `` 1 2` bude čten jako 1 následovaný 2.

Ale tady je jedno z míst, kde je iostreams ve skutečnosti docela slušně navržen: iostream (sám) neurčuje, co jsou mezery. Místo toho to deleguje na národní prostředí streamu.

Pokud chceme ignorovat další haraburdí ve streamu (např. Vše, co není číslicí), můžeme definovat národní prostředí, které říká, že všechno ostatní je prázdné místo, pak jen číst naše čísla ze streamu.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} static std :: ctype_base :: mask const * get_table () { // nejprve vytvořte tabulku, která říká, že vše je prázdné místo: statický std :: vektor rc (std :: ctype :: table_size, std :: ctype_base :: space); // potom nastavte číslice jako skutečně číslice: if (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // vraťte tabulku a podle toho klasifikujte znaky: návrat & rc [0]; }};

Potom řekneme streamu, aby použil toto národní prostředí a načetl data ze streamu:

int main () { std :: istringstream input (R "(11 nevyžádaných 1,00 více nevyžádaných 16,0 stále více nevyžádaných 1,999! @ # $$% ^ $% & * konečně hotovo)"); input.imbue (std :: locale (std :: locale (), nové číslice pouze));std :: vektor čísla {std :: istream_iterator (vstup), {}};}

A protože národní prostředí říká, že všechno kromě číslice je prázdné místo, všechny další „věci“ mezi čísly budou považovány za prázdné znaky (tj. Tiše ignorovány), takže dostaneme pouze čísla.


Odpověď 5:

Čísla v souboru txt si můžete přečíst pomocí následujícího kódu.

#zahrnout

#zahrnout

#zahrnout

void main ()

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

ifstream f1 („abc.txt“);

while (! f1.eof ())

{

fi >> ch;

a = static_cast ch;

arr [i] = a;

}

f1.close ();

getch ();

}

Tento program čte textový soubor, o kterém se předpokládá, že je již vytvořen před tímto programem, protože soubor je ve formátu txt, takže uložíme jedno číslo do proměnné char, protože proměnná typu char může ukládat znaky a poté použijeme funkci static_cast () k vrhněte hodnotu znaku na celočíselnou hodnotu a vložte ji do int a poté použijeme proměnnou k uložení její hodnoty do pole jeden po druhém.

Děkuju …..


Odpověď 6:

Nebudu psát kód, ale vysvětlím to, co nejlépe mohu. Pomocí hlavičky ifstream byste chtěli opakovat smyčku, dokud nebude na vašem objektu ifstream nalezen EOF (konec souboru). Při opakování čte každý řádek textu do řetězcové proměnné. Rozdělte (tokenizujte) každý řetězec na části oddělené mezerami. U každé části (tokenu) vyzkoušejte, zda ji lze převést na celé číslo - pokud je to možné, přidejte ji do svého seznamu, jinak přeskočte na další. V podstatě tedy budete mít vnější smyčku, která dostane řádky textu, a vnitřní smyčku, která rozdělí každý řádek textu na části a zkusí z něj vytvořit číslo.

Jakmile se vrátíte z poslední iterace vnitřní a vnější smyčky, máte seznam, se kterým můžete dělat cokoli.


Odpověď 7:

Řekněme, že máte soubor, konkrétně input.txt, můžete použít následující fragmenty kódu ke čtení celých čísel ze souboru. Doufám, že to pomůže :-)

#zahrnout pomocí jmenného prostoru std;const int sz = 1001; // nastaví sz na maximální velikost poleint pole [sz];int main (){ freopen ("input.txt", "r", stdin); int index = 0, počet; /// skenování do konce souboru while (scanf ("% d", & num) == 1) { pole [index ++] = num; } pro (int i = 0; i printf ("% d", pole [i]); printf ("\ n"); návrat 0;}

Odpověď 8:

Mohli byste se začít učit programovat ...

Takže textový soubor obsahuje číslice (ASCII 48..57, možná 'e' a '-' a '.') A oddělovače (ASCII 13,10,9,32, ať už je váš jed jakýkoli).

Takže přidělíte dostatečně velké int, dlouhé int bez ohledu na pole a začnete jej naplňovat při analýze bajtu souboru bajtem nebo řetězce po řetězci až do dalšího oddělovače.

Víš, proč je můj plat vysoký? Protože jsem to udělal sám, investoval jsem spoustu času a zaměstnavatelé to věděli.


Odpověď 9:

Musíte najít nástroj na internetu, který převádí váš textový soubor do C-pole. Pokud je váš textový soubor zapsán ve formátu CSV (hodnoty oddělené čárkami), myslím, že nebudete mít potíže s nalezením takového nástroje. Jinými slovy, váš textový soubor musí odpovídat známému standardu, v tomto případě jej snadno převedete do C-pole.


Odpověď 10:

Klasickým způsobem C by bylo použití fscanf

C ++ způsobem může být použití ifstream společně s stringstream.

Možná nebudete potřebovat ani stringstream.