c ++ cara membaca fail ke dalam array


Jawapan 1:

C ++ menggunakan C / I standard C untuk mengakses fail. Jadi kod C akan berfungsi dengan baik.

C ++ mempunyai beberapa objek iostream yang bagus dengan banyak barang dengan cara ini.

Ia membantu mengetahui format fail. Adakah anda membaca nombor yang dipisahkan koma, ruang terpisah, atau satu per baris?

Anda betul bahawa itu bukan nombor, tetapi teks berangka. Anda perlu menukar teks menjadi angka setelah dibaca. Tidak mengetahui jenis nombor apa, gunakan dua kali ganda untuk menutup semua pertaruhan.

Jawapan Michael Bauers bagus, tetapi kurang mendapat penjelasan.

buka fail baca teks ubah teks menjadi nombor tambah ke bekas. tutup fail

pengambilan saya:

buat operator untuk memasukkan nombor dari fail ke dalam vektor.

buat vektor nombor buka fail memohon operator untuk mengisi vektor penggunaan fail dekat vektor

// buat operator >> untuk bekerjasama dengan vektor dan istream std :: istream & operator >> (std :: istream & in, std :: vektor & v){ berganda d; sementara (dalam >> d) // ifstream melakukan penukaran teks>> bergandav.push_back (d); // tambah ke vektor kembali masuk; // mengembalikan istream itu sendiri} // buat vektor untuk menahan beregustd :: vektor nombor saya;std :: ifstream inputFile {"file.txt"}; // {} adalah sintaks 'senarai permulaan' semasa (inputFile)inputFile >> nombor saya; // masukkan semua nombor sehingga selesaiinputFile.close (); // tutup fail// sekarang vektor dimuat, fail ditutup - siap.

Gelung baca berada dalam fungsi >> operator, jadi sintaksnya ringkas tetapi sangat mudah dibaca. Apa-apa yang salah (fail tidak dijumpai, tidak ada data ..) dan ifstream membersihkan dirinya sendiri dan menghasilkan pengecualian kegagalan yang anda dapat menangkap atau membiarkan program mati.


Jawapan 2:

Soalan: Bagaimana saya dapat membaca nombor dalam fail teks menjadi larik dalam C ++?

Wow 3 permintaan jawapan dari 3 orang yang berbeza pada soalan yang sama. Pelik! Hampir kelihatan seperti sesuatu yang boleh dilakukan seseorang untuk menentukan jawapan dan bukannya bertanya pada Quora juga. Saya tidak perlu google - saya boleh menulis kod dari ingatan & fikiran saya:

#sertakan #sertakan #sertakan menggunakan ruang nama std;int utama (int argc, char ** argv){ ifstream di ("file.txt", ifstream :: in);vektor lstNombor; semasa ((! in.eof ()) && dalam) { int iNumber = 0; dalam >> iNumber; lstNumbers.push_back (iNumber); } dalam.tutup (); // Apa yang anda mahu lakukan dengan nombor ini ???}

Ok saya berbohong - saya mesti google rujukan C ++ untuk kelas vektor kerana sejujurnya saya tidak pernah menggunakannya. Saya bekerja dengan kerangka kerja QT yang mempunyai kelas tersendiri untuk semua struktur data (senarai, peta, set, dll.). Selain itu, saya biasanya tidak bekerja dengan Fail I / O - Saya bekerja di Java terutamanya secara profesional dan bahkan di sana saya tidak bekerja dengan fail kecuali seperti fail JSON dan XML dan bagi mereka terdapat perpustakaan yang mengaburkan perkara untuk pengaturcara jadi seseorang tidak perlu bimbang untuk membuka, menutup, atau membaca potongan fail. Tetapi ini mesti berlaku untuk anda yang saya percaya.

Saya tidak menguji ini - hanya untuk dijelaskan - Satu perubahan yang mungkin saya buat adalah membungkus kod fail di dalam blok cubaan / tangkapan tetapi kerana C ++ kurang anal mengenai pengecualian seperti Java, saya tidak di sini. Cubaan / tangkapan akan menghentikan kesalahan sial daripada muncul walaupun semasa membuka atau menutup fail - mengandungi kesalahan tersebut.


Jawapan 3:

Sesuatu seperti ini.

Secara umum saya tidak suka gaya membaca secara langsung dari fail. Saya cenderung membaca baris pada satu masa, kemudian menguraikan barisnya. Saya mengakui bahawa saya tidak pernah 100% yakin dengan tingkah laku membaca nombor secara langsung, seperti apa yang berlaku sekiranya terdapat perkara yang bukan nombor.

Kecuali jika ini adalah projek yang menuntut susunan, saya akan menggunakan vektor. Susunan tidak mengubah saiznya, dan menulis program dengan penyangga tetap adalah satu kesalahan, dan saya dapat membuktikannya dengan memberitahu anda tentang setiap masa saya terbakar memikirkan bahawa saya telah membuat ukuran maksimum cukup besar (saya tidak akan, tetapi ada kalanya .)

#sertakan #sertakan #sertakan #sertakan menggunakan ruang nama std;int utama () { ifstream myfile ("d: \\ angka.txt"); jika (myfile.is_open ()) { int arrSize = 0;susunan arr; // Sebaiknya ini adalah vektor, tetapi anda mengatakan susunan sementara (benar) { int x; myfile >> x; jika (myfile.eof ()) rehat; arr [arrSize ++] = x; } untuk (int i = 0; i cout << arr [i] << ""; cout << endl; // Sepatutnya saya menutup fail di sini, tetapi ketika program ini berakhir, saya malas} yang lain { cout << "Tidak dapat membuka fail"; } pulangan 0;}

Jawapan 4:

Sekiranya anda yakin bahawa fail tersebut hanya mengandungi nombor yang ingin anda baca, dan anda cukup masuk akal untuk menganggap "array" sebagai konsep abstrak, dan bukannya merujuk secara khusus kepada perkara array yang diwarisi C ++ dari C, maka ia boleh wajar untuk memulakan vektor (atau vektor , dll) dari fail seperti ini:

std :: input ifstream ("angka.txt");std :: vektor nombor {std :: istream_iterator (input), {}};

(untuk “T” = apa sahaja jenis yang anda ingin baca — int, double, float, dll.)

Sekiranya fail anda mungkin mengandungi "sampah" tambahan di antara nombor, anda masih boleh melakukan perkara yang sama jika anda mahu. Istream_iterator pada dasarnya adalah penyesuai yang menggunakan operator >> untuk membaca item dari aliran. Itu, pada gilirannya, mengabaikan ruang kosong, jadi sesuatu seperti `1 2` akan dibaca sebagai 1 diikuti oleh 2.

Tetapi inilah salah satu tempat iostreams sebenarnya dirancang dengan cukup sopan: iostream tidak (sendiri) menentukan apa itu ruang kosong. Sebaliknya, ia menyerahkannya ke lokasi aliran.

Sekiranya kita ingin mengabaikan sampah tambahan dalam aliran (contohnya, semua yang bukan digit) kita boleh menentukan tempat yang mengatakan bahawa semua perkara lain adalah ruang kosong, kemudian baca nombor kita dari aliran.

struct digits_only: std :: ctype {digit_only (): std :: ctype (get_table ()) {} statik std :: ctype_base :: mask const * get_table () { // pertama, buat jadual yang mengatakan semuanya kosong-kosong: statik std :: vektor rc (std :: ctype :: table_size, std :: ctype_base :: ruang); // kemudian tetapkan digit sebagai sebenarnya digit: jika (rc ['0'] == std :: ctype_base :: ruang) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // kembalikan jadual untuk mengelaskan watak dengan sewajarnya: kembali & rc [0]; }};

Kami kemudian memberitahu aliran untuk menggunakan tempat ini dan membaca data dari aliran:

int utama () { std :: istringstream input (R "(11 sampah 1.00 lebih-sampah 16.0 masih banyak sampah 1.999! @ # $$% ^ $% & * akhirnya selesai)"); input.imbue (std :: locale (std :: locale (), digit_only baru));std :: vektor nombor {std :: istream_iterator (input), {}};}

Dan, kerana penduduk tempatan mengatakan segala sesuatu kecuali digit adalah ruang kosong, semua "barang" tambahan di antara nombor akan dianggap sebagai ruang putih (iaitu, diabaikan secara senyap-senyap) jadi kami hanya mendapat nombor.


Jawapan 5:

Anda boleh membaca nombor dalam fail txt dengan kod berikut.

#sertakan

#sertakan

#sertakan

kekosongan utama ()

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

ifstream f1 ("abc.txt");

sementara (! f1.eof ())

{

fi >> ch;

a = siaran_ statik ch;

arr [i] = a;

}

f1. tutup ();

getch ();

}

Program ini membaca fail teks yang diasumsikan telah dibuat sebelum program ini, kerana failnya dalam format txt jadi kami akan menyimpan satu nombor ke pemboleh ubah char kerana pemboleh ubah yang ditaip char dapat menyimpan watak dan kemudian kami akan menggunakan fungsi static_cast () untuk masukkan nilai watak ke dalam nilai yang diketik bilangan bulat dan masukkan ke dalam int a dan kemudian kita akan menggunakan pemboleh ubah untuk menyimpan nilainya menjadi tatasusit satu demi satu.

Terima kasih …..


Jawapan 6:

Saya tidak akan menulis kodnya, tetapi saya akan menerangkan dengan sebaik mungkin. Dengan menggunakan header ifstream, anda ingin melingkar sehingga EOF (akhir fail) dijumpai pada objek ifstream anda. Semasa perulangan membaca setiap baris teks menjadi pemboleh ubah rentetan. Pisahkan (tokenize) setiap rentetan menjadi bahagian yang dipisahkan dengan spasi. Untuk setiap bahagian (token), uji untuk melihat apakah ia dapat diubah menjadi bilangan bulat — jika boleh, kemudian tambahkan ke senarai anda, jika tidak, lompat ke bahagian berikutnya. Jadi pada dasarnya anda akan mempunyai gelung luar yang mendapat baris teks dan gelung dalaman yang memecah setiap baris teks menjadi beberapa bahagian dan mencuba membuat nombor daripadanya.

Setelah anda berjaya keluar dari lelaran terakhir dari gelung dalaman dan luaran, anda mempunyai senarai yang boleh anda lakukan dengan apa sahaja.


Jawapan 7:

Katakan anda mempunyai fail iaitu input.txt, anda boleh menggunakan coretan kod berikut untuk membaca bilangan bulat dari fail. Semoga ia membantu :-)

#sertakan menggunakan ruang nama std;const int sz = 1001; // tetapkan sz ke ukuran maksimum arrayint array [sz];int utama (){ freopen ("input.txt", "r", stdin); indeks int = 0, angka; /// imbas hingga akhir Fail sementara (scanf ("% d", & num) == 1) { tatasusunan [index ++] = bilangan; } untuk (int i = 0; i printf ("% d", susunan [i]); printf ("\ n"); pulangan 0;}

Jawapan 8:

Anda boleh mula belajar bagaimana memprogram ...

Jadi fail teks mengandungi digit (ASCII 48..57, mungkin 'e' dan '-' dan '.') Dan pemisah (ASCII 13,10,9,32, apa sahaja racun anda).

Oleh itu, anda memperuntukkan int yang cukup besar, panjang mana pun array dan mula mengisinya sambil menguraikan bait fail dengan bait atau rentetan demi rentetan hingga pemisah berikutnya.

Anda tahu mengapa gaji saya tinggi? Kerana saya melakukan ini sendiri, meluangkan banyak masa dan majikan mengetahui perkara ini.


Jawapan 9:

Anda perlu mencari utiliti di internet yang menukar fail teks anda dalam C-array. Sekiranya fail teks anda ditulis dalam format csv (nilai yang dipisahkan dengan koma), saya rasa anda tidak akan menghadapi masalah untuk mencari utiliti tersebut. Dengan kata lain, fail teks anda mesti sesuai dengan standard yang diketahui, dalam hal ini anda akan dengan mudah menukarnya menjadi C-array.


Jawapan 10:

Cara C klasik adalah dengan menggunakan fscanf

Cara C ++ adalah dengan menggunakan ifstream bersama dengan stringstream.

Anda mungkin tidak memerlukan rentetan.