在C++中将文件读取为字符串

3
作为一个从Python背景开始接触C++的新手,我正在尝试将下面的代码翻译成C++。
f = open('transit_test.py')
s = f.read()

什么是最短的C++习惯用语来实现这样的操作?

3
你只是想炫耀!:/ - JohnB
1
@JohnB:还是在寻求同情? - Dan Breslau
1
我认为读取文件不是在“炫耀”。 - Joey Adams
3个回答

6
C++ STL的方法是这样的:
#include <string>
#include <iterator>
#include <fstream>

using namespace std;

wifstream f(L"transit_test.py");
wstring s(istreambuf_iterator<wchar_t>(f), (istreambuf_iterator<wchar_t>()) );

是的,它会。不幸的是,STL没有提供一种自动加载任意编码文件的方式,因此您需要事先知道文件的编码并相应地调整代码,或者使用一个库来识别编码并执行适当的转换。 - Don Reba
2
R s(T(f), T()); 是一个函数声明。 - Abyx
@Abyx: R s(T(f), (T()) ); 不是。;) - DevSolar

6

我相信我之前已经发布过这个内容,但它足够简短,可能不值得去找以前的答案:

std::ifstream in("transit_test.py");
std::stringstream buffer;

buffer << in.rdbuf();

现在,buffer.str() 是一个包含transit_test.py内容的std::string

这不会导致冗余副本吗?这个怎么样。https://dev59.com/xHVC5IYBdhLWcg3w-WOs#138645 - Martin York
1
@Martin:确实会有这个问题,但除非我真的遇到了实际问题(目前还没有),否则我会想知道尝试避免它是否不是一种过早优化。 - Jerry Coffin

-3

在C++中,您可以像这样进行文件读取:

#include <iostream>
#include <fstream>
#include <string>

int main ()
{
    string line;
    ifstream in("transit_test.py"); //open file handler
    if(in.is_open()) //check if file open
    {
        while (!in.eof() ) //until the end of file
        {
            getline(in,line); //read each line
            // do something with the line
        }
        in.close(); //close file handler
    }
    else
    {
         cout << "Can not open file" << endl; 
    }
    return 0;
}

1
除了相对较长之外,这段代码还存在漏洞:通常会出现读取最后一行两次的情况(while (!in.eof()) 几乎是一个已知的 bug)。 - Jerry Coffin
1
永远不要在while条件中放置eof的测试。 - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接