【问题标题】:Is there a way to read an input string with "ifstream"有没有办法用“ifstream”读取输入字符串
【发布时间】:2017-12-10 21:45:33
【问题描述】:

目前我的程序将一个字符串作为输入,我使用argc and argv 访问它

然后我用

FILE *fp, *input = stdin;
fp = fopen("input.xml","w+b");
    while(fgets(mystring,100,input) != NULL)
    {
        fputs(mystring,fp);
    }
    fclose(fp);

我做这部分只是为了创建一个文件 input.xml 然后我提供给

ifstream in("input.xml");
    string s((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());

获取s 作为字符串(基本字符串)。 有没有办法将我的输入直接提供给ifstream? (即给ifstream提供一个字符串)。

【问题讨论】:

  • 不,ifstream 旨在读取文件。如果您想将std::string 作为istream 提供,可以使用std::stringstream
  • 完全不清楚您要的是什么。您是否将要读取的字符串作为程序的参数,还是要将文件的内容读入std::string
  • 在我下面的回答中,我完全忽略了你提到的argcargv,这似乎没有意义。
  • @user0042 我将它作为我程序的参数。

标签: c++ string file format ifstream


【解决方案1】:

如果我猜对了,那么您想将通过标准输入提供的所有文本读入字符串。

实现此目的的一种简单方法是使用std::getline,它将直到特定分隔符的所有字节读取到字符串中。如果您可以假设它是文本内容(不包含任何\0-字符),您可以编写以下内容:

std::string s;
std::getline(cin,s,'\0');

【讨论】:

    【解决方案2】:

    让我直说:

    1. 您从标准输入中读取了一个字符串
    2. 您将其写入文件
    3. 然后您从文件中读取它
    4. 并使用文件流对象创建字符串

    那是疯狂的谈话!

    删除文件流,直接从 STDIN 实例化字符串:

    string s(
       (std::istreambuf_iterator<char>(std::cin)),
       std::istreambuf_iterator<char>()
    );
    

    请记住,std::cinstd::istream,标准库的 IOStreams 部分是为这种对数据的通用访问而设计的。

    但请注意,your approach with std::istreambuf_iterator is not the most efficient,如果您正在读取大量数据,这可能是一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多