c ++ как да чета файл в масив


Отговор 1:

C ++ използва C стандартни I / O за достъп до файлове. Така че C кодът ще работи добре.

C ++ има някои хубави iostream обекти, които правят куп хубави неща по този начин.

Помага да се знае форматът на файла. Четете ли запетаи разделени числа, разделени с интервал или по един на ред?

Прав си, че те не са числа, а цифров текст. Ще трябва да преобразувате текста в числа, след като бъдат прочетени. Не знаейки какви числа, използвайте двойно, за да покриете всички залози.

Отговорът на Майкъл Бауерс е добър, но му липсват обяснения.

отворен файл четене на текст конвертиране на текст в номер добавяне в контейнер. затваряне на файл

моето мнение:

създайте оператор за подаване на числа от файл във вектор.

създаване на числов вектор отворен файл приложи оператор за попълване на вектор затваряне на файл използва вектор

// създаване на оператор >> за работа с вектор и istream std :: istream & оператор >> (std :: istream & in, std :: vector & v){ двойно d; while (в >> d) // ifstream прави text-> двойно преобразуванеv.push_back (d); // добавяне към вектор връщане в; // връща самия istream} // направете вектор за задържане на двойкиstd :: вектор мои номера;std :: ifstream inputFile {"file.txt"}; // {} е синтаксис на „списък за инициализация“ докато (inputFile)inputFile >> mynumbers; // въведете всички числа, докато приключитеinputFile.close (); // затваряме файла// сега се зарежда вектор, файлът е затворен - готов.

Цикълът за четене е във функцията оператор >>, така че синтаксисът е кратък, но много четим. Всичко се обърка (файлът не е намерен, няма данни ..) и ifstream се почиства и генерира изключение за повреда, което можете да хванете или да оставите програмата да умре.


Отговор 2:

Въпрос: Как мога да чета числа в текстов файл в масив в C ++?

Уау 3 искания за отговор от 3 различни хора, всички по този един и същ въпрос. Странно! Почти изглежда като нещо, което някой би могъл да потърси в Google, за да определи отговора, вместо да го попита и на Quora. Не е нужно да гугъл - мога да напиша кода от паметта и съзнанието си:

#include #include #include използване на пространство от имена std;int main (int argc, char ** argv){ ifstream в ("file.txt", ifstream :: in);вектор lstNumbers; докато ((! in.eof ()) && in) { int iNumber = 0; в >> iNumber; lstNumbers.push_back (iNumber); } in.close (); // Какво искате да направите с тези числа ???}

Добре, излъгах - трябваше да потърся в референцията на C ++ за векторния клас, защото честно казано никога не го използвам. Работя с QT рамката, която има свои собствени класове за всички структури от данни (списък, карта, набор и т.н.). Освен това обикновено не работя с File I / O - работя в Java предимно професионално и дори там не работя с файлове, освен като JSON и XML файлове, а за тези има библиотеки, които абстрахират нещата за програмиста така че човек не трябва да се притеснява за отваряне, затваряне или четене на парчета от файла. Но това би трябвало да ви свърши работа, вярвам.

Не тествах това - само за да бъда изяснен - ​​Една промяна, която бих могъл да направя, е да увия файловия код в блок try / catch, но тъй като C ++ е по-малко анален по отношение на изключенията като Java, не го направих тук. Опитът / уловът ще спре появата на досадни грешки дори при отваряне или затваряне на файла - съдържащ грешката, така да се каже.


Отговор 3:

Нещо като това.

Като цяло не харесвам стила на четене на ints директно от файл. Склонен съм да чета ред наведнъж, след това да анализирам реда. Признавам, че никога не съм на 100% сигурен в поведението на четенето на числа директно, като например какво се случва, ако има интервенционни неща, които не са числа.

Ако това не е проект, изискващ масиви, бих използвал вектор. Масивите не преоразмеряват и писането на програми с фиксирани буфери е грешка и мога да го докажа, като ви разказвам за всички времена, когато съм се изгарял, мислейки, че съм направил максималния размер достатъчно голям (няма, но имаше моменти .)

#include #include #include #include използване на пространство от имена std;int main () { ifstream myfile ("d: \\ numbers.txt"); ако (myfile.is_open ()) { int arrSize = 0;масив arr; // В идеалния случай това би било вектор, но вие казахте масив докато (вярно) { int x; myfile >> x; ако (myfile.eof ()) почивка; arr [arrSize ++] = x; } за (int i = 0; i cout << arr [i] << ""; cout << endl; // Трябваше да затворя файла тук, но тъй като програмата свършваше, бях мързелив} друго { cout << "Не може да се отвори файл"; } връщане 0;}

Отговор 4:

Ако сте сигурни, че файлът съдържа само числа, които искате да прочетете, и сте достатъчно разумни, за да третирате „масива“ като абстрактна концепция, вместо да се позовавате конкретно на масива, който C ++ е наследил от C, тогава той може е доста разумно да инициализирате вектор (или вектор и т.н.) от файл нещо подобно:

std :: ifstream input (“numbers.txt”);std :: вектор числа {std :: istream_iterator (вход), {}};

(за „T“ = какъвто и тип да искате да прочетете - int, double, float и т.н.)

Ако вашият файл може да съдържа допълнителни „боклуци“ между числата, все пак можете да направите същото нещо, ако искате. Istream_iterator е основно адаптер, който използва оператор >> за четене на елементи от потока. Това от своя страна игнорира празното пространство, така че нещо като `1 2` ще се чете като 1, последвано от 2.

Но ето едно от местата, в които iostreams всъщност е доста прилично проектиран: iostream не (сам) определя какво е бялото пространство. Вместо това той делегира това на локала на потока.

Ако искаме да игнорираме допълнителни боклуци в потока (например всичко, което не е цифра), можем да дефинираме локал, който казва, че всичко останало е празно пространство, тогава просто прочетете номерата си от потока.

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} статичен std :: ctype_base :: маска const * get_table () { // първо, създайте таблица, в която се казва, че всичко е бяло пространство: статичен std :: вектор rc (std :: ctype :: table_size, std :: ctype_base :: space); // след това задаваме цифрите като действително цифри: if (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // връщаме таблицата, за да класифицираме съответно символите: връщане & rc [0]; }};

След това казваме на потока да използва този локал и четем данни от потока:

int main () { std :: istringstream input (R "(11 боклуци 1.00 повече боклуци 16.0 още повече боклуци 1.999! @ # $$% ^ $% & * накрая готово)"); input.imbue (std :: locale (std :: locale (), нови цифри_само));std :: вектор числа {std :: istream_iterator (вход), {}};}

И тъй като локалът казва, че всичко с изключение на цифрата е бяло пространство, всички допълнителни „неща“ между числата ще бъдат третирани като празно пространство (т.е. тихо игнорирани), така че просто получаваме числата.


Отговор 5:

Можете да четете числата в txt файл от следния код.

#include

#include

#include

void main ()

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

ifstream f1 („abc.txt“);

докато (! f1.eof ())

{

fi >> ch;

a = static_cast ch;

arr [i] = a;

}

f1.close ();

getch ();

}

Тази програма чете текстов файл, за който се предполага, че вече е направен преди тази програма, тъй като файлът е във формат txt, така че ще съхраним едно число в променлива char, тъй като променливата тип char може да съхранява символи и след това ще използваме функцията static_cast (), за да хвърляме стойността на символа в цяло число и го поставяме в int a и след това ще използваме променлива, за да съхраняваме стойността й в масив един по един.

Благодаря ти …..


Отговор 6:

Няма да пиша кода, но ще обясня най-доброто, което мога. Използвайки заглавката ifstream, бихте искали да завъртате, докато EOF (края на файла) бъде намерен във вашия обект ifstream. Докато цикли четете всеки ред текст в низ променлива. Разделете (маркирайте) всеки низ на части, разделени с интервали. За всяка част (маркер) тествайте, за да видите дали тя може да бъде преобразувана в цяло число - ако може, добавете я към вашия списък, в противен случай преминете към следващата. Така че по същество ще имате външен цикъл, който получава редове текст и вътрешен цикъл, който разделя всеки ред текст на части и прави опит за създаване на число от него.

След като спасите от последната итерация на вътрешния и външния цикъл, имате списък, с който можете да правите каквото и да е.


Отговор 7:

Да предположим, че имате файл, а именно input.txt, можете да използвате следните кодови фрагменти, за да прочетете цели числа от файла. Надявам се да помогне :-)

#include използване на пространство от имена std;const int sz = 1001; // задайте sz на максимален размер на масивамасив int [sz];int main (){ freopen ("input.txt", "r", stdin); индекс int = 0, num; /// сканиране до края на файла докато (scanf ("% d", & num) == 1) { масив [индекс ++] = число; } за (int i = 0; i printf ("% d", масив [i]); printf ("\ n"); връщане 0;}

Отговор 8:

Бихте могли да започнете да се учите как да програмирате ...

Така че текстовият файл съдържа цифри (ASCII 48..57, може би "e" и "-" и ".") И разделители (ASCII 13,10,9,32, каквато и да е вашата отрова).

Така че разпределяте достатъчно голям int, long int какъвто и да е масив и започвате да го попълвате, докато анализирате файла байт по байт или низ по низ до следващия разделител.

Знаете ли защо заплатата ми е висока? Защото направих това сам, инвестирах много време и работодателите знаят това.


Отговор 9:

Трябва да намерите помощна програма в интернет, която преобразува вашия текстов файл в C-масив. Ако вашият текстов файл е написан в CSV формат (стойности, разделени със запетая), мисля, че няма да имате проблеми с намирането на такава програма. С други думи, вашият текстов файл трябва да отговаря на известен стандарт, в този случай лесно ще го конвертирате в C-масив.


Отговор 10:

Класическият C начин би бил използването на fscanf

Начинът на C ++ може да бъде използването на ifstream заедно със stringstream.

Възможно е дори да не се нуждаете от струнен поток.