c ++ як читати файл у масиві


Відповідь 1:

C ++ використовує стандартний ввід-вивід C для доступу до файлів. Тож код С працюватиме чудово.

У C ++ є кілька приємних об'єктів iostream, які роблять купу приємних речей таким чином.

Це допомагає знати формат файлу. Читаєте ви комами розділені цифри, пробіл або по одному рядку?

Ви праві, що це не цифри, а числовий текст. Вам потрібно буде перетворити текст у цифри після їх прочитання. Не знаючи, які цифри, використовуйте подвійний для покриття всіх ставок.

Відповідь Майкла Бауерса хороша, але їй не вистачає пояснень.

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

моя думка:

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

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

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

Цикл читання знаходиться у функції оператора >>, тому синтаксис стислий, але дуже читабельний. Щось піде не так (файл не знайдено, даних немає ..), і ifstream очищається і генерує виняток відмови, який ви можете вловити або дати програмі загинути.


Відповідь 2:

Питання: Як я можу прочитати числа в текстовому файлі в масив на C ++?

Вау 3 запити на відповіді від трьох різних людей на все те саме питання. Дивно! Майже схоже на те, що хтось міг погуглити, щоб визначити відповідь, а не запитати на Quora. Мені не потрібно гуглити - я можу написати код з пам’яті та свого розуму:

#включати #включати #включати використання простору імен 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, який має власні класи для всіх структур даних (список, карта, набір тощо). Крім того, я зазвичай не працюю з введенням / виведенням файлів - я працюю в Java переважно професійно, і навіть там я не працюю з файлами, за винятком файлів JSON та XML, а для них є бібліотеки, які абстрагують речі для програміста. тому не потрібно турбуватися про те, щоб відкрити, закрити чи прочитати фрагменти з файлу. Але це повинно зробити трюк для вас, я вважаю.

Я не тестував цього - лише для того, щоб пояснити - Однією зміною, яку я можу зробити, є обгортання коду файлу всередині блоку try / catch, але оскільки C ++ менш анальний щодо винятків, як Java, я тут цього не зробив. Функція try / catch зупинить появу настирливих помилок навіть під час відкриття або закриття файлу - так би мовити, містить помилку.


Відповідь 3:

Щось на зразок цього.

Загалом, мені не подобається стиль читання текстів з файлу. Я схильний читати рядок за раз, а потім аналізувати рядок. Я визнаю, що ніколи не впевнений на 100% у поведінці безпосереднього читання чисел, наприклад, що відбувається, якщо є втручаються речі, які не є числами.

Якщо це не проект, що вимагає масивів, я б використовував вектор. Масиви не змінюють розмір, а написання програм із фіксованими буферами є помилкою, і я можу це довести, розповівши вам про всі часи, коли я опікся, думаючи, що зробив максимальний розмір досить великим (не буду, але були випадки .)

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

Відповідь 4:

Якщо ви впевнені, що файл містить лише цифри, які ви хочете прочитати, і ви достатньо розумні, щоб розглядати "масив" як абстрактне поняття, а не посилатися конкретно на річ масиву, яку С ++ успадкував від С, тоді він може бути досить розумним для ініціалізації вектора (або вектор та ін.) з файлу приблизно так:

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

(для “T” = будь-який тип, який ви хочете прочитати - int, double, float тощо)

Якщо у вашому файлі може міститися зайва кількість "сміття" між номерами, ви все одно можете зробити те саме, якщо хочете. Istream_iterator - це в основному адаптер, який використовує оператор >> для читання елементів з потоку. Це, в свою чергу, ігнорує пробіли, тому щось на зразок `1 2` буде читатися як 1, а потім 2.

Але ось одне з місць, де iostream насправді досить пристойно розроблений: 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); // потім встановлюємо цифри як фактично цифри: якщо (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:

Ви можете прочитати цифри у текстовому файлі за таким кодом.

#включати

#включати

#включати

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, ви можете використовувати такі фрагменти коду для зчитування цілих чисел із файлу. Сподіваюся, це допоможе :-)

#включати використання простору імен std;const int sz = 1001; // встановіть для sz максимальний розмір масивумасив int [sz];int main (){ freopen ("input.txt", "r", stdin); індекс int = 0, num; /// сканувати до кінця Файлу while (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.

Можливо, вам навіть не потрібен струнний потік.