在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;
这不是短语句或者单语句行,但它是一行,而且还算不错。