我需要一种快速简便的方法来从标准C ++中的文件中获取字符串。我可以编写自己的,但只是想知道C ++中是否已有标准方法。
如果您了解Cocoa,则相当于此:
NSString *string = [NSString stringWithContentsOfFile:file];
答案 0 :(得分:17)
我们可以做到,但这是一个很长的路线:
#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”
答案 1 :(得分:10)
几乎可以使用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的评论)。
答案 2 :(得分:3)
标准C ++库不提供执行此操作的功能。
答案 3 :(得分:2)
我能做的最好是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());
答案 4 :(得分:2)
怎么样:
#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;
}
答案 5 :(得分:0)
如果您按照以下方式执行此操作(但不像下面那样正确包装),您可以在文件中读取而不必担心文件中的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 ++流的问题。所以,不要理会这篇文章。
答案 6 :(得分:0)
std::string temp, file; std::ifstream if(filename); while(getline(if, temp)) file += temp;
这不是一个简短或单一的陈述行,但它是一行而且它真的没那么糟糕。