C ++阅读文件

时间:2009-05-08 19:40:19

标签: c++

在c ++中读取文件并将其内容分配给字符串所需的最小代码是多少? 我确实阅读了很多有用的教程,但它们在某种程度上都有所不同,所以我想知道为什么,所以如果你能提供一些很好的解释性评论。


相关: What is the best way to read an entire file into a std::string in C++?

7 个答案:

答案 0 :(得分:3)

似乎是重复的:

How do you get a file in C++?

无论如何,一个很好的参考:http://www.cplusplus.com/doc/tutorial/files/

答案 1 :(得分:2)

#include <fstream>
#include <string>

int main()
{
    std::ifstream file("myfile.txt");  // open the file
    std::string line, whole_file;

    // Read one line at a time from 'file' and store the result
    // in the string called 'line'.
    while (std::getline(file, line))
    {
        // Append each line together so the entire file will
        // be in one string.
        whole_file += line;
        whole_file += '\n';
    }

    return 0;
    // 'file' is closed automatically when the object goes out of scope.
}

这里有几点需要注意。 getline()返回对流对象的引用,如果发生任何错误或者到达文件末尾,则对while测试失败。此外,字符串中包含尾随换行符 not ,因此您必须手动附加它。

答案 2 :(得分:2)

最短的代码:(效率不高)

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>

int main()
{
    std::ifstream f("plop");


    std::string buffer;
    std::copy(std::istreambuf_iterator<char>(f),
              std::istreambuf_iterator<char>(),
              std::back_inserter(buffer));
}

我怎么可能这样做:

#include <iostream>
#include <string>    
#include <vector>
#include <algorithm>
#include <iterator>
#include <fstream>



int main()
{
    // Find the size of the file
    std::ifstream       file("Plop");
    file.seekg(0,std::ios_base::end);

    std::streampos      size    = file.tellg();

    // Read the file in one go.
    file.seekg(0);
    std::vector<char>   buffer(size); // pre-szie the vector.
    file.read(&buffer[0],size);

    // or

    // Until the next version of the standard I don't think string gurantees contigious storage.
    // But all the current versions I know do use continious storage so it should workd.
    file.seekg(0);
    std::string         buffer1(size);
    file.read(&buffer1[0],size);
}

答案 3 :(得分:2)

我没有看到太多:

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

int main() {
    ifstream ifs("filename");
    stringstream ss;
    ss << ifs.rdbuf();
    string s = ss.str();
}

......正如我所料。你也想要一些错误检查。

Konrad Rudolph将此作为上述相关问题的答案。我想这不是重复的,因为这要求最短的代码,但答案是相同的。所以我把它作为wiki重新发布。

答案 4 :(得分:1)

我正在读每行的一句话。

    #include<fstream>
    #include<string>
    using namespace std;    
    int main(int argc, char **argv)
    {
    fstream inFile;
    string str;
    while(!inFile.eof())
    {
    inFile.open("file.txt");
    infile>>str;
    }
    inFile.close();
    return 0;
    }

答案 5 :(得分:0)

这比短解决方案更长,但可能稍微更高效,因为它的复制少一点 - 我没有做过任何时序比较:

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

unsigned int FileRead( istream & is, vector <char> & buff ) {
    is.read( &buff[0], buff.size() );
    return is.gcount();
}

int main() {
    ifstream ifs( "afile.dat", ios::binary );
    const unsigned int BUFSIZE = 64 * 1024; 
    std::vector <char> buffer( BUFSIZE );
    unsigned int n;
    string s;
    while( n = FileRead( ifs, buffer ) ) {
        s.append( &buffer[0], n );
    }

    cout <<  s;
}

答案 6 :(得分:0)

如果您知道您的文件包含文字,那么您可以使用STLSoftplatformstl::memory_mapped_file

platformstl::memory_mapped_file file("your-file-name");
std::string contents(static_cast<char const*>(file.memory()), file.size());

platformstl::memory_mapped_file file("your-file-name");
std::wstring contents(static_cast<wchar_t const*>(file.memory()), 
          file.size() / sizeof(wchar_t));

在WIndows上,这将使您的字符串包含\r\n个序列,因此您可以改为使用winstl::load_text_file()函数:

std::string contents;
winstl::load_text_file("your-file-name", contents);

如果您希望将其加载到行集合中,请使用platformstl::read_lines()

platformstl::basic_file_lines<char> lines("your-file-name");
size_t n = lines.size();
std::string line3 = lines[3];