相关疑难解决方法(0)

在C++中将整个文件读入std :: string的最佳方法是什么?

如何将文件读入a std::string,即一次读取整个文件?

文本或二进制模式应由调用者指定.该解决方案应符合标准,便携且高效.它不应该不必要地复制字符串的数据,它应该避免在读取字符串时重新分配内存.

实现此目的的一种方法是统计文件大小,调整大小std::stringfread()进入std::string's const_cast<char*>()' data().这要求std::string数据是连续的,这是标准不需要的,但似乎是所有已知实现的情况.更糟糕的是,如果在文本模式下读取文件,则其std::string大小可能与文件大小不同.

一个完全正确的,符合标准的和便携式解决方案,可以构建使用std::ifstreamrdbuf()进入std::ostringstream,并从那里进入std::string.但是,这可能会复制字符串数据和/或不必要地重新分配内存.所有相关的标准库实现是否足够智能以避免所有不必要的开销?还有另一种方法吗?我是否错过了一些已经提供所需功能的隐藏Boost功能?

请显示您的建议如何实施.

void slurp(std::string& data, bool is_binary)
Run Code Online (Sandbox Code Playgroud)

考虑到上面的讨论.

c++ string file-io

155
推荐指数
10
解决办法
6万
查看次数

C++:变量'std :: ifstream ifs'具有初始值但不完整的类型

对不起,如果这是非常noobish,但我是C++的新手.我正在尝试打开一个文件并使用ifstream以下方法阅读:

vector<string> load_f(string file) {
  vector<string> text;

  ifstream ifs(file);
  string buffer, str_line;

  int brackets = 0;
  str_line = "";

  while ( getline(ifs, buffer) ) {
    buffer = Trim( buffer );
    size_t s = buffer.find_first_of("()");

    if (s == string::npos) str_line += "" + buffer;
    else {
      while ( s != string::npos ) {
        str_line += "" + buffer.substr(0, s + 1);
        brackets += (buffer[s] == '(' ? 1 : -1);

        if ( brackets == 0 ) {
          text.push_back( str_line …
Run Code Online (Sandbox Code Playgroud)

c++ fstream return-type

126
推荐指数
1
解决办法
12万
查看次数

如何在C++中从cin读取EOF

我正在编写一个程序,直接从用户输入读取数据,并想知道我怎么能(没有循环)读取所有数据,直到标准输入EOF.我正在考虑使用,cin.get( input, '\0' )'\0'不是真正的EOF角色,只读到EOF或者'\0'以先到者为准.

或者使用循环是唯一的方法吗?如果是这样,最好的方法是什么?

c++ iostream input

75
推荐指数
6
解决办法
19万
查看次数

用c ++编写文本/二进制文件最优雅的方法是什么?

我在阅读时发现了一些好的结果,例如:使用迭代器和预分配读取txt,或者读入容器.所以我想知道如何将最优雅的std :: string写入文件?

编辑:读取时我可以通过seek和tellg预先为字符串分配空间,因为我知道字符串的大小,我怎么能告诉文件系统我要写多少?

c++ string file-io file text-files

3
推荐指数
1
解决办法
6660
查看次数

RapidXML从文件中读取 - 这里有什么问题?

这两种读取输入文件的方法有什么区别?

1)使用 'ifstream.get()'

2)使用vector<char>with ifstreambuf_iterator<char> (我不太了解!)

(除了使用漂亮的矢量方法的明显答案)

输入文件是XML,如下所示,立即解析为rapidxml文档.(在其他地方初始化,参见示例main函数.)

首先,让我向您展示两种编写'load_config'函数的方法,一种使用ifstream.get(),一种使用vector<char>

方法1 ifstream.get()提供了工作代码和一个安全的rapidXML文档对象:

rapidxml::xml_document<> *load_config(rapidxml::xml_document<> *doc){
   ifstream myfile("inputfile");

   //read in config file
   char ch;
   char buffer[65536];
   size_t chars_read = 0;

   while(myfile.get(ch) && (chars_read < 65535)){
      buffer[chars_read++] = ch;
   }
   buffer[chars_read++] = '\0';

   cout<<"clearing old doc"<<endl;
   doc->clear();

   doc->parse<0>(buffer);

   //debug returns as expected here
   cout << "load_config: Name of my first node is: " << doc->first_node()->name() << "\n";

   return doc;
}
Run Code Online (Sandbox Code Playgroud)

方法2导致另一个库的cloberred rapidXML文档 - 特别是对curl_global_init(CURL_GLOBAL_SSL)的调用[参见下面的主要代码] - 但我还没有把它归咎于curl_global_init. …

c++ file-io rapidxml code-formatting libcurl

0
推荐指数
1
解决办法
3840
查看次数

如何在C/C++中存储可变长度字符串

可能重复:
在c ++中将文件粘贴到std :: string的最佳方法是什么?

我试图将整个文本文件存储为字符串,如何动态存储文本文件可能包含的任何数量的字符?

c c++

-1
推荐指数
1
解决办法
4499
查看次数