在C ++中是否存在单行将文件读入字符串的情况?

时间:2020-03-06 14:45:19  来源:igfitidea点击:

我需要一种快速简便的方法来从标准C ++中的文件中获取字符串。我可以编写自己的代码,但只想知道C ++中是否已经存在标准方法。

如果我们知道可可粉,则等同于此:

NSString *string = [NSString stringWithContentsOfFile:file];

解决方案

标准的C ++库没有提供执行此操作的功能。

我能做的最好的是5行:

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

ifstream f("filename.txt");
f.seekg(0, ios::end);
vector<char> buffer(f.tellg());
f.seekg(0, ios::beg);
f.read(&buffer[0], buffer.size());

使用istream_iterator几乎可以实现(3行!)

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

using namespace std;

int main()
{
    ifstream file("filename.txt");
    string fileContents;

    copy(istreambuf_iterator<char>(file),
              istreambuf_iterator<char>(),
              back_inserter(fileContents));
}

Edited摆脱了中间字符串流,现在直接复制到字符串中,现在使用istreambuf_iterator,它忽略空格(感谢Martin York的评论)。

怎么样:

#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

int main( void )
{
  stringstream os(stringstream::out);
  os << ifstream("filename.txt").rdbuf();
  string s(os.str());
  cout << s << endl;
}

如果按照以下方式进行操作(但与下面的内容正确包装在一起),则可以读入文件,而不必担心文件中的0x1A字节(例如)会缩短文件的读取时间。先前建议的方法将阻塞文件中的0x1A(例如)。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
using namespace std;

int main() {
    FILE* in = fopen("filename.txt", "rb");
    if (in == NULL) {
        return EXIT_FAILURE;
    }
    if (fseek(in, 0, SEEK_END) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    const long filesize = ftell(in);
    if (filesize == -1) {
        fclose(in);
        return EXIT_FAILURE;
    }
    vector<unsigned char> buffer(filesize);
    if (fseek(in, 0, SEEK_SET) != 0 || fread(&buffer[0], sizeof(buffer[0]), buffer.size(), in) != buffer.size() || ferror(in) != 0) {
        fclose(in);
        return EXIT_FAILURE;
    }
    fclose(in);
}

但是,是的,虽然它不是已经实现的1-liner。

编辑:0x1A不是一个很好的例子,因为ios_base :: binary可以解决这个问题。但是,即使那样,当使用.read()一次读取png文件时,C ++流也经常给我带来麻烦。使用C方式效果更好。只是不记得一个很好的例子来说明为什么。可能是.read()在循环中以块为单位的二进制文件,相反,这可能是C ++流的问题。因此,请忽略此帖子。

我们可以做到,但行很长:

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

using namespace std;

int main()
{
    // The one-liner
    string fileContents(istreambuf_iterator<char>(ifstream("filename.txt")), istreambuf_iterator<char>());

    // Check result
    cout << fileContents;
}

编辑:使用" istreambuf_iterator"而不是" istream_iterator"

std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;

这不是短语句或者单语句行,但它是一行,而且还算不错。