Как считать динамический массив из файла с
Перейти к содержимому

Как считать динамический массив из файла с

  • автор:

Чтение чисел из текстового файла в динамический массив

При попытке считывания цифр из файла и их записи в одномерный массив, считывание прекращалось при появлении первого же пробела.

#include #include using namespace:: std; int main()< int input_float_vector_size=0; float* input_float_vector = new float[input_float_vector_size]; // динамический вектор, для записи полученных из файла чисел в массив ifstream file; file.open("INPUT.txt"); if(!file.is_open())< cout else< while(file>>input_float_vector[input_float_vector_size]) < cout > delete [] input_float_vector; file.close(); 

return 0; > Этот вопрос наверняка давно имеет ответ. Однако найденные советы не помогали. Вскоре эмпирически выяснилось, что проблема решается способом открытия самого файла. При открытии с помощью конструктора ifstream file(«INPUT.txt»), а не традиционно file.open(«INPUT.txt») все работает прекрасно! Объясните причину.

Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
задан 6 янв 2020 в 6:54
299 2 2 серебряных знака 18 18 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Ваша, гм. вобщем, неприятности тут:

int input_float_vector_size=0; float* input_float_vector = new float[input_float_vector_size]; // динамический вектор, для записи полученных из файла чисел в массив 

Выделен массив нулевой длины. Который, как бы вы ни надеялись, что, увеличивая некую переменную, он будет расти — так поверьте, это то же самое, что написать на бумажке «дай мне 100 рублей» и получив их, рассчитывать, что если вы теперь на бумажке зачеркнете 100 и напишете 10000 — то у вас от этого в кошельке что-то прибавится.

Вы пишете неизвестно куда, имея классическое «неопределенное поведение», так что то, что вам кажется что программа заработала — так это не так.

vector input; . float i; while(file >> i) input.push_back(i); 

Можно вообще через copy , но это пока для вас рановато, разберитесь с этим.

Если препод требует именно через массив — то надо или брать массив заведомо больший, или при каждом чтении смотреть — заполнен выделенный массив или нет, и если да — то выделять новый побольше и перекопировать все считанное в него.

Как считать динамический массив из файла с

Здравствуйте, я написал программу по работе с динамическим массивом. Программа выполняет следующие действия:
1. Открывает входящий файл.
2. Считает количество строчек в нём -> count.
3. Создает динамический массив, состоящий из count элементов.
4. Считывает данные из входящего файла и заполняет ими этот массив.
5. Печатает массив на экран.

#include "stdafx.h" #include "stdio.h" #include "iostream.h" int count=0; //Глобальный счётчик элементов во входящем файле void counter (FILE *f1) //Программа-счётчик количества элементов (строчек) в файле с исходными данными < cout cout int *fill_array (FILE *f1) //Программа заполнения динамического массива с чтением файла < cout int i; for(i=0;i cout void print_array (int* row) //Печатаем содержимое динамического массива < cout > int main(int argc, char* argv[]) < cout printf("\nFiles are being opened"); if((f1=fopen(argv[1], "r")) == NULL) //Открываем входящий поток - файл с исходным временным рядом < perror(argv[1]); return 1; >if((f2=fopen(argv[2], "w+")) == NULL) //Открываем выходящий поток для записи результатов < perror(argv[2]); return 1; >counter(f1); //Запустили счётчик записей, результат - в count int *row; //Инициализация динамического массива для дальнейшей работы row=fill_array (f1);//Динамический массив заполняется специальной функцией, открывающей файл с исходными данными print_array (row);//И выводится на экран return 0; >

Проблема в 5 пункте — она печатает не то, что было в исходном файле. Появляются какие-то одинаковые цифры. Может, она неправильно заполняет динамический массив данными из файла? Или неправильно его выводит на экран?

На вход подается текстовый файл:

10
13
23
4
76
12
-9
4
0
73
12

Чтение из файла в динамический массив

Здравствуйте.
Такая проблема. Читаю из файла числа в динамический массив. Сначала посчитал количество символов, создал массив и записываю в него данные из файла. Но при выводе в конце почему то записывается мусор. Помогите пожалуйста как убрать мусор.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include #include #include using namespace std; int main() { fstream fs("1.txt"); if (!fs) { cout  "File not found\n"; system("pause"); } int count =0; char a; while(!fs.eof()) { fs>>a;// count++; } fs.clear(); fs.seekg(0); int *mas=new int[count]; for (int i=0;icount;i++) fs>>mas[i]; for (int i=0;icount;i++) coutmas[i]' '; cout"\n"; fs.close(); system("pause"); }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Чтение из файла в динамический массив
#include <stdio.h> #include <string.h> #include <iostream> #include <fstream> using namespace.

Чтение из файла в динамический массив
Подскажите, читаю из файла количество элементов, затем элементы, но выводит нули.. Что не так.

Чтение из файла в динамический массив
Всем здравствуйте. Рабочий вариант чтения в байтовый массив: ifstream in(sFileName.

Чтение данных из файла в динамический массив структур
Здравствуйте, подскажите пожалуйста, как можно осуществить чтение данных из файла в динамический.

7595 / 6418 / 2924
Регистрация: 14.04.2014
Сообщений: 27,946
Почему ты считаешь char’ами, а считываешь int’ами?

1 2 3 4 5 6 7 8 9
int count =0; int a; while(true) 

45 / 42 / 48
Регистрация: 13.05.2015
Сообщений: 222
Подсчёт символов лучше делайте так:

while (fs>>a) count++;

Тогда не будет мусора при выводе.
25 / 25 / 15
Регистрация: 17.02.2014
Сообщений: 310

В указали не правильный тип данных так как чар это символ и считывает он по символьно например 10 это два символа 1 и 0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#include #include #include using namespace std; int main() { fstream fs("1.txt"); if (!fs) { cout  "File not found\n"; system("pause"); } int count = 0; int a; while (!fs.eof()) { fs >> a; count++; } fs.clear(); fs.seekg(0); int *mas = new int[count]; for (int i = 0; icount; i++) fs >> mas[i]; for (int i = 0; icount; i++) cout  mas[i]  ' '; cout  "\n"; fs.close(); system("pause"); }

Добавлено через 6 минут
nmcf

ЦитатаСообщение от nmcf Посмотреть сообщение

1 2 3 4 5 6 7 8
int count =0; int a; while(true)  fs >> a; if (fs.fail() 

зачем делать два условия в цикле и в разветвлении

1 2 3 4 5
while (!(fs.fail() || fs.eof())) { fs >> a; count++; }

Считывание строк из файла и запись в массив на C++

Чтение из файла

Follow us on Twitter Follow us on rss

Добрый день! В этой статье я расскажу о том, как написать программу, которая будет считывать строки из файла. Покажу как записать их в массив или вывести. При написании программы будут использоваться функции из стандартной библиотеки языка C++.

Стандартная библиотека языка C++ включает множество функций для работы с файлами. Описание функций можно найти в сети или в учебниках по C++. Здесь же я опишу одну, которая позволит произвести чтение строки из файла.

Для начала определимся с файлом, с которого будем считывать информацию. Я создал файл с именем «strings.txt» и записал в него информацию, которую буду считывать в массив и выводить на экран.

is the first line is the second line is the third line

Три строки, содержащиеся в файле, я запишу массив и выведу на экран.

Пингвин читает содержимое файла

Пингвин читает содержимое файла

Переходим к написанию программы на C++.

Нашей программе понадобятся два заголовочных файла и . Первый нужен будет для использования вывода на консоль, второй для работы с файлами.

Объявим две целочисленные константы len и strings, они будут хранить максимальную длину наших строк и количество строк. Объявим символьную константу ch, которая будет хранить разделяющий символ. Первые две константы будут использоваться для объявления массива. Мой файл содержит 3 строки

const int len = 30, int strings = 3; const char ch = '\n';

При помощи значений двух первых констант объявим двумерный массив символов.

char mass[len][strings];

Создадим объект класса ostream, в конструктор поместим адрес файла, флаги открытия.

ifstream fs("strings.txt", ios::in | ios::binary);

Флаг ios::in позволяет открыть файл для считывания, ios::binary открывает его в двоичном режиме.

Далее стоит проверить открылся ли файл, если не открылся, то завершаем работу программы.

В данный момент программа имеет такой вид

#include #include using namespace std; int main()

Теперь остается описать алгоритм считывания строк из файла и занесения их в массив с последующим выводом. Для этого понадобится цикл от нуля до strings с инкрементом переменной r. Во время каждого прохода цикла используем перегруженную функцию getline() объекта fs с тремя аргументами.

fs.getline(Массив_символов, Макс_длина_строки, Разделитель_строк)

Функция считывает символы из файла, пока не считает количество равное Макс_длина_строки, либо не встретит на своём пути символ равный Разделитель_строк, а после записывает считанные символы в Массив_символов. В качестве разделителя в моём текстовом файле используется перенос строки.

После сразу же выводим содержимое строки, хранящееся в массиве, при помощи поточного вывода в консоль cout.

Весь листинг конечной программы

#include #include using namespace std; int main() < const int len = 30, strings = 5; const char ch = '\n'; char mass[len][strings]; ifstream fs("strings.txt", ios::in | ios::binary); if(!fs) return 1; //Если ошибка открытия файла, то завершаем программу for(int r = 0; rString 1 = is the first line String 2 = is the second line String 3 = is the third line String 4 = String 5 = -------------------------------- Process exited after 0.02249 seconds with return value 0

За счет константных переменных её можно легко модернизировать. Изменив константу strings, можно указать количество выводимых строк. Чтение из файла будет производится до тех пор, пока массив не заполнится нужным количеством строк. Изменив константу ch, можно изменить разделитель строк(Например, можно разделять их пробелом и занести в массив отдельные слова из файла и т.д.).

Если Вас интересует запись в файл, то почитайте статью о чтении из input.txt и записи данных в файл output.txt.

Пример работы string и пример считывания всех строк из файла в массив с последующим выводом

#include #include #include #include #include using namespace std; int main () < string str; cout << "Enter string (EOL = $) : "; getline (cin, str, '$'); cout << "Str is : " << str << endl; ifstream In("data.dat"); vectorv; cout copy(v.begin(),v.end(), ostream_iterator(cout, "\n")); cout

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *