Как читать построчно или сразу весь текстовый файл?

86

Я нахожусь в учебнике, который знакомит с файлами (как читать и писать из \ в файл)

Прежде всего, это не домашнее задание, это просто общая помощь, которую я ищу.

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

Что делать, если мой файл содержит 1000 слов? Читать каждое слово непрактично.

Мой текстовый файл с именем (Read) содержит следующее:

Я люблю играть в игры люблю читать у меня есть 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
sampson-chen
возможный дубликат Как прочитать строку из текстового файла в c / c ++?
Адриан Маккарти
Пословное чтение лишь незначительно медленнее, чем построчное. Если действительно нужны слова, то лучше слова читать. Прочтите строки, если вы имеете дело с строчно-ориентированными данными, такими как файл CSV.
@Arkadiy, это неверно. Для файла размером 100 МиБ построчное чтение легко займет секунды, а чтение блока размером 4 КиБ за секунды меньше секунды.
vallentin
@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');
}  
111111
источник
9
Хотя это и не очевидно, while(getline(f, line)) { ...}это рекомендуемый способ сделать это. Это объясняется здесь: gehrcke.de/2011/06/… --- там вы также найдете полезные подходы для правильной обработки ошибок.
Доктор Ян-Филип Герке
1
Приведенный выше код не будет компилироваться без#include <iostream>
Tyguy7
@ 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;
}
user2673553
источник
2
Хороший ответ, я использовал это со строковым потоком вместо cout, чтобы превратить весь файл в гигантский строковый поток
bjackfly
5

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

Бартек Баначевич
источник
Я не знаю, кто проголосовал против этого ответа, но это хорошо, может быть, я не
придерживаюсь
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);
}

Затем вы можете просто перебрать вектор и изменить / извлечь то, что вам нужно /

Bugster
источник
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;
}

Удачи !

Амирхозейн Рошан
источник