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

如果您了解Cocoa,则相当于此:

NSString *string = [NSString stringWithContentsOfFile:file];
有帮助吗?

解决方案

我们可以做到,但这是一个很长的路线:

#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”

其他提示

几乎可以使用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));
}

已编辑 - 删除了中间字符串流,现在直接复制到字符串中,现在使用istreambuf_iterator,它会忽略空格(感谢Martin York的评论)。

标准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());

怎么样:

#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 ++流的问题。所以,不要理会这篇文章。

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

这不是一个简短或单一的陈述行,但它是一行而且它真的没那么糟糕。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top