БлогNot. С++: читаем текстовый файл в вектор строк

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

С++: читаем текстовый файл в вектор строк

Немного познакомившись с векторами и поточными классами, это легко сделать.

Предположив, что юникод-файл с именем data.txt расположен в текущей папке консольного проекта, прочитаем его строки в вектор из элементов string, а затем выведем в консоль общее количество строк и символов в файле.

Обратите внимание, что если в конце файла есть "лишний" перевод строки, на которую можно поставить курсор, но она не содержит ни одного символа, отдельной строкой такая позиция считаться не будет:

Здесь
Три
Строки
|

Также стоит посмотреть, как находится сумма длин строк стандартным методом accumulate из библиотеки <numeric>, содержащий "заготовки" для реализации типовых алгоритмов. При этом для Юникода посчитается именно "общее количество байт, отведённое под все символы", исключая "двойной" для Windows символ CR/LF (\r\n, возврат каретки и перевод строки). Для приведённого выше теста получим:

3 string(s)
28 chars(s) without endl

при размере юникод-файла 34 байта.

"|" в последней строке тестового файла - не символ, а обозначение положения курсора при наличии CR/LF после слова "Строки".

Если последняя строка не завершается CR/LF и файл имеет размер 32 байта, ответы всё равно не изменятся :)

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <numeric> /*библиотека для стандартных алгоритмов сумма, произведение и т.п.*/
using namespace std;

void error (string message,int errorcode) {
 cout << endl << message;
 system("pause>nul"); 
 exit(errorcode);
}

int main() {
 string line;
 vector <string> v;
 ifstream file("data.txt"); /*файл - в Юникоде (utf-8)*/
 if (!file) {
  error(string("Error opening output file"),1);
 }
 while (getline(file, line)) {
  v.push_back(line);
 }

 cout << endl << v.size() << " string(s)";

 int chars = accumulate(v.begin(), v.end(), 0, [](int sum, const string &item) {
    return sum + item.size();
 });
 cout << endl << chars << " chars(s) without endl";
 
 system("pause>nul"); return 0;
}

теги: c++ форматы алгоритм

03.05.2017, 11:19; рейтинг: 1784

  свежие записипоиск по блогукомментариистатистикао "вирусах" в архивах .zip

Наверх Яндекс.Метрика
© PerS
вход