对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险.
C++标准库有几个参考,包括非常有价值的ISO标准,MSDN,IBM,cppreference和cplusplus.就个人而言,在编写C++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用.但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:
cplusplus.com提供的错误,误解或错误建议有哪些?使用它来做出编码决策有哪些风险?
让我补充一点:我希望能够通过标准的准确报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站,如果不是这个问题.
如何将文件读入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)
考虑到上面的讨论.
让我们为这个问题创建一个补充问题.在C++中获取文件大小的最常用方法是什么?在回答之前,确保它是可移植的(可以在Unix,Mac和Windows上执行),可靠,易于理解且没有库依赖(没有boost或qt,但是例如glib是可以的,因为它是可移植的库).
在像Perl这样的脚本语言中,可以一次将文件读入变量.
open(FILEHANDLE,$file);
$content=<FILEHANDLE>;
Run Code Online (Sandbox Code Playgroud)
在C++中最有效的方法是什么?
我确定我在手册中错过了这个,但是如何使用标题中的C++ istream类来确定文件的大小(以字节为单位)fstream?
我正在做一些非常简单的事情:将整个文本文件从磁盘中抹去std::string.我目前的代码基本上是这样的:
std::ifstream f(filename);
return std::string(std::istreambuf_iterator<char>(f), std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
它不太可能对程序产生任何性能影响,但我仍然很好奇这是否是一种缓慢的方式.
是否存在构造字符串将涉及大量重新分配的风险?在读取之前使用seekg()/ tellg()计算文件大小和reserve()字符串中的那么多空间会更好(也就是说更快)吗?
我想只阅读文本文件的最后一行(我在UNIX上,可以使用Boost).我所知道的所有方法都需要扫描整个文件以获得最后一行,这根本没有效率.有没有一种有效的方法来获得最后一行?
此外,我需要它足够健壮,即使有问题的文本文件经常被另一个进程附加,它也能正常工作.
我有一个类型的文件流ofstream.构造函数以追加模式打开文件,所有消息总是写在文件末尾.
我需要写入一些固定大小的输出文件,例如1Mb,然后我需要关闭,重命名和压缩它,然后打开一个同名的新文件.
这需要在达到特定大小的文件时完成.
我尝试使用tellg()但是在网上阅读了东西(和这个)后,我明白这不是正确的方法.
由于我是C++的新手,我正在尝试找出最优化和正确的方法来获得准确的文件当前大小ofstream?
class Logger {
std::ofstream outputFile;
int curr_size;
Logger (const std::string logfile) : outputFile(FILENAME,
std::ios::app)
{
curr_size = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
在程序的某个地方,我正在写入数据:
// ??? Determine the size of current file ???
if (curr_size >= MAX_FILE_SIZE) {
outputFile.close();
//Code to rename and compress file
// ...
outputFile.open(FILENAME, std::ios::app);
curr_size = 0;
}
outputFile << message << std::endl;
outputFile.flush();
Run Code Online (Sandbox Code Playgroud) 为什么这会失败,它应该是简单而有效的?
fisier.seekg(0, ios::end);
long lungime = fisier.tellg();
Run Code Online (Sandbox Code Playgroud)
这将返回一个比文件更大的值,从而导致错误
char *continut = new char[lungime];
Run Code Online (Sandbox Code Playgroud)
知道问题可能是什么?
我也尝试一次计数到文件的末尾一个char,它产生相同的结果,比预期的数字更高.但是一旦使用getline()一次读取一行,它就可以工作,没有多余的空格......
我正在玩ifstream来熟悉它.我试图使用seekg来告诉文件的位置,但它给了我错误的结果.
这个想法是:
原始文件看起来像这样(Windows格式):
file.txt的
aA
bB
cC
dD
eE
fF
Run Code Online (Sandbox Code Playgroud)
运行我的代码,我得到结果:
position: 0
got: a
position: 6
got: A
position: 7
Run Code Online (Sandbox Code Playgroud)
但是,对于此文件:
file.txt的
aAbBcCdDeEfF
Run Code Online (Sandbox Code Playgroud)
我得到了这些结果
position: 0
got: a
position: 1
got: A
position: 2
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
test.cpp(mingw/gcc5.3)
#include <fstream>
#include <iostream>
using namespace std;
static char s[10];
int main(int argc, char **argv)
{
ifstream f("file.txt");
cout << "position: " << f.tellg() << "\n";
f.read(s, 1);
cout << "got: " << s << …Run Code Online (Sandbox Code Playgroud)