Як читати рядок за рядком або цілий текстовий файл відразу?


86

Я навчаюсь у підручнику, який представляє файли (як читати та писати з \ у файл)

Перш за все, це не домашнє завдання, це лише загальна допомога, яку я шукаю.

Я знаю, як читати одне слово за раз, але не знаю, як читати по одному рядку або як читати весь текстовий файл.

Що робити, якщо мій файл містить 1000 слів? Читати кожне слово непрактично.

Мій текстовий файл із назвою (Читати) містить наступне:

Я люблю грати в ігри Люблю читати У мене є 2 книги

Це те, що я досяг дотепер:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

  ifstream inFile;
  inFile.open("Read.txt");

  inFile >>

Чи існує якийсь спосіб прочитати весь файл відразу, замість того, щоб читати кожен рядок чи кожне слово окремо?


4
Є цілком певні відповіді тут: stackoverflow.com/questions/551082/c-read-lines-from-file
Семпсон-чен


Читання слова за словом відбувається лише незначно повільніше, ніж рядок за рядком. Якщо вам насправді потрібні слова, тоді краще читати слова. Прочитайте рядки, якщо ви маєте справу з рядково-орієнтованими даними, такими як файл CSV.

@Arkadiy це неправильно. Для файлу розміром 100 Мб читання рядків за рядком легко займе секунди, тоді як читання блоку розміром 4 КіБ за секунду менше секунди.
valentin

@Vallentin: Враховуючи, що всі потоки буферизовані, фактичне читання диска виконується вже блок за блоком. Решта - це просто маніпулювання даними в пам'яті.

Відповіді:


161

Ви можете використовувати std::getline:

#include <fstream>
#include <string>

int main() 
{ 
    std::ifstream file("Read.txt");
    std::string str; 
    while (std::getline(file, str))
    {
        // Process str
    }
}

Також зауважте, що краще просто побудувати потік файлів з іменами файлів у його конструкторі, а не явно відкривати (те саме стосується і закриття, просто нехай деструктор виконує роботу).

Подальшу документацію про std::string::getline()це можна прочитати за посиланням CPP .

Напевно, найпростіший спосіб прочитати цілий текстовий файл - це просто об’єднати отримані рядки.

std::ifstream file("Read.txt");
std::string str;
std::string file_contents;
while (std::getline(file, str))
{
  file_contents += str;
  file_contents.push_back('\n');
}  

9
Хоча це і не очевидно, while(getline(f, line)) { ...}насправді є рекомендованим способом зробити це. Це пояснюється тут: gehrcke.de/2011/06/… --- там ви також знайдете корисні підходи для належної обробки помилок.
Доктор Ян-Філіп Герке

1
Наведений вище код не буде #include <iostream>
скомпільовано

@ Tyguy7 Чому #include <iostream>потрібно? Мені здається, цього <fstream>і <string>вистачає. Якщо ви маєте на увазі std::getline, це в <string>, а не в <iostream>.
Фабіо каже "Поновити Моніку"

@FabioTurati Я не впевнений, я просто знаю, що як тільки я його включив, все склалося чудово.
Tyguy7,

19

Я знаю, що це справді дуже стара тема, але я хотів би також вказати на інший спосіб, який насправді дуже простий ... Ось зразок коду:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {

    ifstream file("filename.txt");
    string content;

    while(file >> content) {
        cout << content << ' ';
    }
    return 0;
}

2
Приємна відповідь, я використав це із ланцюжком рядків замість cout, щоб перевести весь файл у гігантський рядок
bjackfly

5

Я думаю, ви могли б використовувати функцію istream .read (). Ви можете просто виконати цикл з розумним розміром фрагмента і прочитати безпосередньо в буфер пам'яті, а потім додати його до якогось довільного контейнера пам'яті (наприклад, std :: vector). Я міг би написати приклад, але я сумніваюся, що ви хочете отримати повне рішення; будь ласка, повідомте мене, якщо вам знадобиться якась додаткова інформація.


Я не знаю, хто голосував за цю відповідь, але це добре, можливо, я не відповідаю вашим стандартам, але я використовую те саме
Javasist

4

Ну, для цього можна також скористатися функцією freopen, передбаченою в C ++ - http://www.cplusplus.com/reference/cstdio/freopen/, і прочитати файл за рядком наступним чином -:

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
   freopen("path to file", "rb", stdin);
   string line;
   while(getline(cin, line))
       cout << line << endl;
   return 0;
}

1

Інший метод, про який ще не згадувалося, - це std::vector.

std::vector<std::string> line;

while(file >> mystr)
{
   line.push_back(mystr);
}

Тоді ви можете просто перебирати вектор і змінювати / витягувати те, що вам потрібно /


4
Це vectorнепотрібний крок. Ви можете переглядати ifstreamвикористання std::istream_iterator<std::string>(inFile).
Джозеф Менсфілд,

0

Ви також можете використовувати це, щоб прочитати всі рядки у файлі по одному, а потім надрукувати i

#include <iostream>
#include <fstream>

using namespace std;



bool check_file_is_empty ( ifstream& file){
    return file.peek() == EOF ;
}

int main (){


    string text[256];
    int lineno ;
    ifstream file("text.txt");
    int num = 0;

    while (!check_file_is_empty(file))
    {    
        getline(file , text[num]);
        num++;
    }
    for (int i = 0; i < num ; i++)
    {
        cout << "\nthis is the text in " <<  "line " << i+1 << " :: " << text[i] << endl ;


    }
    
    system("pause");

    return 0;
}

сподіваюся, це може вам допомогти :)


0

привіт, брате, це спосіб прочитати рядок у точному рядку за допомогою цього коду

сподіваюся, це може вам допомогти!

#include <iostream>
#include <fstream>

using namespace std;


int main (){


    string text[1];
    int lineno ;
    ifstream file("text.txt");
    cout << "tell me which line of the file you want : " ;
    cin >> lineno ; 



    for (int i = 0; i < lineno ; i++)
    {
        
        getline(file , text[0]);

    }   

    cout << "\nthis is the text in which line you want befor  :: " << text[0] << endl ;
    system("pause");

    return 0;
}

Удачі !

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.