我需要在C++中加载和使用CSV文件数据.此时它实际上只是一个以逗号分隔的解析器(即不用担心转义新行和逗号).主要需求是逐行解析器,每次调用方法时都会返回下一行的向量.
我发现这篇文章很有前途:http: //www.boost.org/doc/libs/1_35_0/libs/spirit/example/fundamental/list_parser.cpp
我从未使用过Boost的精神,但我愿意尝试.但只有在没有更直接的解决方案的情况下,我才会忽视.
close()我使用时需要手动拨打电话std::ifstream吗?
例如,在代码中:
std::string readContentsOfFile(std::string fileName) {
std::ifstream file(fileName.c_str());
if (file.good()) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return buffer.str();
}
throw std::runtime_exception("file not found");
}
Run Code Online (Sandbox Code Playgroud)
我需要file.close()手动拨打电话吗?不应该ifstream使用RAII来关闭文件?
如何将文件读入a std::string,即一次读取整个文件?
文本或二进制模式应由调用者指定.该解决方案应符合标准,便携且高效.它不应该不必要地复制字符串的数据,它应该避免在读取字符串时重新分配内存.
实现此目的的一种方法是统计文件大小,调整大小std::string和fread()进入std::string's const_cast<char*>()' data().这要求std::string数据是连续的,这是标准不需要的,但似乎是所有已知实现的情况.更糟糕的是,如果在文本模式下读取文件,则其std::string大小可能与文件大小不同.
一个完全正确的,符合标准的和便携式解决方案,可以构建使用std::ifstream的rdbuf()进入std::ostringstream,并从那里进入std::string.但是,这可能会复制字符串数据和/或不必要地重新分配内存.所有相关的标准库实现是否足够智能以避免所有不必要的开销?还有另一种方法吗?我是否错过了一些已经提供所需功能的隐藏Boost功能?
请显示您的建议如何实施.
void slurp(std::string& data, bool is_binary)
Run Code Online (Sandbox Code Playgroud)
考虑到上面的讨论.
在像Perl这样的脚本语言中,可以一次将文件读入变量.
open(FILEHANDLE,$file);
$content=<FILEHANDLE>;
Run Code Online (Sandbox Code Playgroud)
在C++中最有效的方法是什么?
我确定我在手册中错过了这个,但是如何使用标题中的C++ istream类来确定文件的大小(以字节为单位)fstream?
我正在寻找一种方法将一些数据填充到DLL边界的字符串中.因为我们使用不同的编译器,所有的dll接口都是简单的char*.
是否有正确的方法将指针传递给dll函数,以便它能够直接填充字符串缓冲区?
string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() ); // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );
Run Code Online (Sandbox Code Playgroud)
看起来最有希望的是&stringToFillIn [0]但是这是一个正确的方法,假设你认为string :: data()==&string [0]?这似乎不一致.
或者最好是吞下额外的分配并避免问题:
vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );
Run Code Online (Sandbox Code Playgroud) 我需要将文件复制到字符串中.我需要为该字符串对象预先分配内存以及直接将文件内容读入该字符串内存的方法吗?
许多其他帖子,如"将整个ASCII文件读入C++ std :: string "解释了一些选项是什么,但没有深入描述各种方法的优缺点.我想知道为什么一种方法优于另一种方法?
所有这些都std::fstream用于将文件读入std::string.我不确定每种方法的成本和收益.让我们假设这是一个常见的情况,其中已知读取文件是一些小的内存可以轻松容纳,无论你如何操作,清楚地将多TB文件读入内存是一个坏主意.
在几个谷歌搜索将整个文件读入std :: string之后,最常见的方法std::getline是在每行之后使用并添加换行符.这对我来说似乎不用了,但有一些性能或兼容性原因,这是理想的吗?
std::string Results;
std::ifstream ResultReader("file.txt");
while(ResultReader)
{
std::getline(ResultReader, Results);
Results.push_back('\n');
}
Run Code Online (Sandbox Code Playgroud)
我拼凑在一起的另一种方法是更改getline分隔符,使其不在文件中.EOF字符似乎不太可能在文件的中间,所以这似乎是一个可能的候选人.这包括一个强制转换,所以至少有一个原因不这样做,但这确实会立即读取一个文件而没有字符串连接.据推测,分隔符检查仍然需要一些费用.有没有其他充分理由不这样做?
std::string Results;
std::ifstream ResultReader("file.txt");
std::getline(ResultReader, Results, (char)std::char_traits<char>::eof());
Run Code Online (Sandbox Code Playgroud)
转换意味着在将std :: char_traits :: eof()定义为-1以外的系统上可能会出现问题.这是一个实际的理由,不选择使用std::getline和其他方法string::push_pack('\n').
如何在这个问题中将这些文件与其他读取文件的方法进行比较:将整个ASCII文件读入C++ std :: string
std::ifstream ResultReader("file.txt");
std::string Results((std::istreambuf_iterator<char>(ResultReader)),
std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
这似乎是最好的.它将几乎所有工作卸载到标准库上,该库应该针对给定平台进行大量优化.除了流有效性和文件结尾之外,我认为没有理由进行检查.这是理想的还是存在看不见的问题.
标准或某些实现的细节是否提供了偏好某种方法而不是另一种方法的理由?我是否错过了一些可能在各种情况下都很理想的方法?
什么是最简单,最惯用,最佳性能和标准兼容的方式将整个文件读入std::string?
编辑 - 2 这个问题促使我写了一小套基准.它们是MIT许可证,可在github上获得:https://github.com/Sqeaky/CppFileToStringExperiments
最快 - TellSeekRead和CTellSeekRead-这些系统提供了一个容易获得的大小并一次读取文件.
更快 - Getline追加和Eof - 检查字符似乎没有任何成本.
快 - RdbufMove和Rdbuf - std :: move似乎在发布中没有任何区别. …
我正在使用fstream和C++,我希望我的程序要做的就是将终止的.txt文件的内容打印到终端.这可能很简单,但我在网上看了很多东西,我找不到任何可以帮助我的东西.我怎样才能做到这一点?这是我到目前为止的代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
string output;
ifstream myfile;
ofstream myfile2;
string STRING;
myfile.open ("/Volumes/LFARLEIGH/Lucas.txt");
myfile2 << "Lucas, It Worked";
myfile >> STRING;
cout << STRING << endl;
myfile.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
先感谢您.如果这很简单,请原谅我,因为我对C++很新
之间有什么区别streampos和pos_type,streamoff并且off_type,除非他们被不同的定义.我应该用什么basic_stream<>::seek功能?