【问题标题】:Read first n letters from file to a string?从文件中读取前n个字母到字符串?
【发布时间】:2014-04-14 15:43:41
【问题描述】:

我对编程很陌生,现在我正在做一个练习,我应该使用一个循环从文件中读取 25 个第一个符号,其中包含 25 个字母的字符串(如果名称短于 + 空格,则25) 和两个数字。示例:

Whirlpool machine         324 789.99

我想它应该是这样的:

ifstream info("Information.txt");
string str;
int a;
double b;
for(int i = 0; i < 25; i++)
{ // some kind of code to get first 25 symbols into a string.
}
info >> a >> b;

而且我似乎无法找到将 25 个字符直接转换为字符串的正确代码。有什么建议吗?

【问题讨论】:

  • 你可能想read他们?
  • 查看此答案以逐字符读取文件,不包含空格:stackoverflow.com/a/12240035/2142219
  • @JoachimPileborg 我是一个初学者,我没有得到你示例中显示的一半。
  • @Human 可能有用,但我正在寻找字符串类型的解决方案,而不是 char。

标签: c++ file-io


【解决方案1】:

一种简单的方法是使用read() 读取给定数量的字符:

int length = 25;             // num of chars you want to read
str.resize(length, ' ');     // reserve spaces
char* begin = &*str.begin();
info.read(begin, length);    // <- read it here

【讨论】:

    【解决方案2】:

    您可以将std::copy_n() 算法与流缓冲区迭代器一起使用:

    std::string str;
    
    std::copy_n(std::istreambuf_iterator<char>(info.rdbuf()),
                25, std::back_inserter(str));
    

    您可能更习惯使用get()for() 循环:

    for (char c; str.size() != 25 && info.get(c); )
        str += c;
    

    【讨论】:

    • copy_n 方法不是一个坏主意,但是当你调用它时你有太多的参数。 (我还将第二个循环 sn-p 写为char ch; while ( str.size() != 25 &amp;&amp; info.get( ch ) ) str += ch;
    • 我总是 typedef istream_iterator 和类似的,但这只是我
    • @JamesKanze 谢谢 :)
    【解决方案3】:

    鉴于上下文,我会将整行读入一个字符串,使用 std::getline,然后提取子串。比如:

    std::string line;
    while ( std::getline( info, line ) ) {
        std::string header = line.substr( 0, 25 );
        //  and later...
        std::istringstream rest( line.substr( 25 ) );
        int a;
        double b;
        rest >> a >> b;
        //  ...
    }
    

    一般来说,在读取面向行的输入时,读取行, 然后使用 std::istringstream 解析它。或者,如果有 您可以“按原样”使用的部分(就像这里的情况一样),按原样使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2010-12-15
      • 2020-09-04
      • 1970-01-01
      • 2020-06-12
      相关资源
      最近更新 更多