Добрый день! В этой статье я расскажу о том, как написать программу, которая будет считывать строки из файла. Покажу как записать их в массив или вывести. При написании программы будут использоваться функции из стандартной библиотеки языка C++.
Стандартная библиотека языка C++ <fstream> включает множество функций для работы с файлами. Описание функций можно найти в сети или в учебниках по C++. Здесь же я опишу одну, которая позволит произвести чтение строки из файла.
Для начала определимся с файлом, с которого будем считывать информацию. Я создал файл с именем «strings.txt» и записал в него информацию, которую буду считывать в массив и выводить на экран.
Содержание файла strings.txt
1 2 3 |
is the first line is the second line is the third line |
Три строки, содержащиеся в файле, я запишу массив и выведу на экран.
Переходим к написанию программы на C++.
Нашей программе понадобятся два заголовочных файла <iostream> и <fstream>. Первый нужен будет для использования вывода на консоль, второй для работы с файлами.
Объявим две целочисленные константы len и strings, они будут хранить максимальную длину наших строк и количество строк. Объявим символьную константу ch, которая будет хранить разделяющий символ. Первые две константы будут использоваться для объявления массива. Мой файл содержит 3 строки
1 2 |
const int len = 30, int strings = 3; const char ch = '\n'; |
При помощи значений двух первых констант объявим двумерный массив символов.
1 |
char mass[len][strings]; |
Создадим объект класса ostream, в конструктор поместим адрес файла, флаги открытия.
1 |
ifstream fs("strings.txt", ios::in | ios::binary); |
Флаг ios::in позволяет открыть файл для считывания, ios::binary открывает его в двоичном режиме.
Далее стоит проверить открылся ли файл, если не открылся, то завершаем работу программы.
В данный момент программа имеет такой вид
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <fstream> 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; fs.close(); return 0; } |
Теперь остается описать алгоритм считывания строк из файла и занесения их в массив с последующим выводом. Для этого понадобится цикл от нуля до strings с инкрементом переменной r. Во время каждого прохода цикла используем перегруженную функцию getline() объекта fs с тремя аргументами.
fs.getline(Массив_символов, Макс_длина_строки, Разделитель_строк)
Функция считывает символы из файла, пока не считает количество равное Макс_длина_строки, либо не встретит на своём пути символ равный Разделитель_строк, а после записывает считанные символы в Массив_символов. В качестве разделителя в моём текстовом файле используется перенос строки.
После сразу же выводим содержимое строки, хранящееся в массиве, при помощи поточного вывода в консоль cout.
Весь листинг конечной программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <fstream> 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; r<strings; r++) { fs.getline(mass[r], len-1,ch); //Считываем строки в массив cout << "String " << r+1 << " = "<< mass[r] << endl; //Выводи строку из массива } fs.close(); //Закрываем файл return 0; } |
Программа выводит строки и успешно завершается, возвращая 0.
1 2 3 4 5 6 7 8 |
String 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 и пример считывания всех строк из файла в массив с последующим выводом
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 <iterator> #include <iostream> #include <string> #include <vector> #include <fstream> using namespace std; int main () { string str; cout << "Enter string (EOL = $) : "; getline (cin, str, '$'); cout << "Str is : " << str << endl; ifstream In("data.dat"); vector<string> v; cout << endl << "Read data from file" << endl; while ( ! In.eof() ) { getline (In, str); v.push_back(str); } copy(v.begin(),v.end(), ostream_iterator<string>(cout, "\n")); cout << endl; return 0; } |
Очень полезно, спасибо!
Спасибо помогло
С++ Чтение файла в массив F:\strings.txt или F:\\strings.txt?
F:\
Хороший пример, а если с Qt работать, то это удобнее и проще
Это рассмотрено в статье http://nicknixer.ru/programmirovanie/qfile-i-fajly-chtenie-i-zapis-strok-v-fajl/
Блин, вот теперь понятно
Здравствуйте! Подскажите, пожалуйста, как после вышеизложенного заполнения массива отдельно просуммировать значения в четных и нечетных строках?? Массив заполнен десятичными дробями. Одно число в одной строке.
Здравствуйте, в вашем случае без массива можно обойтись, складывая значения строк сразу при считывании информации из файла. Так как данный способ в статье был для известно заданного количества строк в файле, то если мы заранее не знаем сколько строк в файле, программа просто непригодна. Такой вариант можно и нужно учесть.
Ответил на Ваш вопрос целой статьей https://nicknixer.ru/otvety/najti-summu-znachenij-chisel-v-chetnyx-i-nechetnyx-strokax-fajla/
Команда :
strcat(имя 1 элемента, имя 2 элемента);
Если между склеивымами строками нужен пробел, то необходима промежуточная.склейка:
strcat(имя 1 элемента, ‘ ‘);
strcat(имя 1 элемента, имя 2 элемента);
а с динамическим массивом можно как то сделать? Если я допустим не знаю максимальную длину строки?
Да, можно воспользоваться String
Thanks a lot:)
Хочу спросить как выводить нужную строку через консолью
Например у меня есть csv файл из 52 строк. Я хочу вывести ту строку которую я указываю в консоле.
Помогите пожалуйста новичку))
А как можно вывести определённый элемент массива ?
Здравствуйте, а как быть если количество строк заранее не известно? В комментариях ниже вы посоветовали использовать String, можно пожалуйста пример как это будет выглядеть?
Для строк с неизвестной длиной можно использовать string из библиотеки
Если заранее неизвестно количество строк, тогда нужен динамический массив строк, то есть можно использовать vector
В комментариях плохо с форматированием кода, поэтому добавил код прямо в конец статьи «Пример работы string и пример считывания всех строк из файла в массив с последующим выводом»
С векторами я кончено незнаком, но разве в выш вектор vector v, не должен иметь какой-то вид типа vector v; ?
Не смог понять сути вопроса, объясните подробнее?
vector v = {7, 5, 16, 8}; Вот пример вектора из интерна.
Я вам написал просто vector v; Но во время обработки моего комментария эти лапки почему-то стерлись. Крч суть в том, что вы не правильно объявили вектор и из-за этого не компилирует
Вот снова, что это у вас за проверка комментария, есть кавычки аки знаки больше меньше(которые почему-то удаляются когда я их пишу в комментариях), они должны быть у вектора при инициализации, у вас их нет
Проблема в вордпрессе, он не умеет отображать эти символы в комментариях.
Я поправил, теперь если скопировать из статьи, то код компилируется
А как по этому массиву найти отдельную строку?
К примеру
for (int i = 0; i <= 40; i++) // 40 — число строк, word — слово которое нужно найти, оно точно есть в файле и в массиву
{
if (strcmp(word, nomerstr[i]) == 0)
{
cout << nomerstr[i + 1] << endl;
break;
}
}
Не работает