如何一次一行一行地读取整个文本文件?


86

我在一个介绍文件的教程中(如何读写文件)

首先,这不是家庭作业,这只是我寻求的一般帮助。

我知道如何一次阅读一个单词,但我不知道如何一次阅读一行或如何阅读整个文本文件。

如果我的文件包含1000个单词怎么办?阅读每个单词是不切实际的。

我的文本文件名为(读取)包含以下内容:

我喜欢玩游戏,喜欢阅读,我有两本书

到目前为止,这是我已经完成的工作:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

有没有可能一次读取整个文件的方法,而不是分别读取每一行或每个单词?




逐字阅读仅比逐行阅读稍慢。如果您实际上需要单词,那么最好阅读单词。如果要处理诸如CSV文件之类的面向行的数据,请读取行。

@Arkadiy不正确。对于100 MiB文件,逐行读取将很容易花费几秒钟,而在不到一秒的时间内读取4 KiB的块。
瓦伦丁'16

@Vallentin:由于所有流都已缓冲,因此实际的磁盘读取已逐块完成。其余的只是操作内存中的数据。

Answers:


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/… ---您还可以找到有用的方法来正确处理错误。
Jan-Philip Gehrcke博士,2015年

1
否则,以上代码将无法编译#include <iostream>
Tyguy7

@ Tyguy7为什么会#include <iostream>被要求?在我看来,这<fstream><string>是不够的。如果您的意思是std::getline,它在里面<string>,而不是在里面<iostream>
法比奥说恢复莫妮卡

@FabioTurati我不确定,我只知道一旦包含了它,一切都可以正常编译。
Tyguy7 '17

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一起使用,以将整个文件转换成巨大的
字符串流

5

我认为您可以使用istream .read()函数。您可以以合理的块大小循环并直接读取到内存缓冲区,然后将其附加到某种任意的内存容器中(例如std :: vector)。我可以写一个例子,但是我怀疑你想要一个完整的解决方案。请让我知道您是否需要任何其他信息。


我不知道是谁拒绝了这个答案,但这很好,可能是因为我不是您的标准,但我使用的是同一件事
Javasist 2012年


1

尚未提及的另一种方法是std::vector

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

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

然后,您可以简单地遍历向量并修改/提取所需的内容/


4
vector是不必要的步骤。您可以遍历ifstreamusing 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;
}

祝好运 !

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.