【问题标题】:C++ read string with spacesC ++读取带空格的字符串
【发布时间】:2013-04-14 18:37:40
【问题描述】:

我有这样的文件:

59 137 New York
137 362 Syracuse
216 131 New Jersey
...
..
.

我想把它读成一个结构: X - Y - 城市名称

  char city[100];
  int x , y;
  f.open("map.txt");
  f >> x >> y >> city;
  while (!f.fail()) {
    f >> x >> y >> city;
  }
  f.close();

问题是,那个城市只能读取到下一个空格,所以从纽约它只能读取 New。 我应该如何以某种简单而聪明的方式阅读整行的其余部分?

【问题讨论】:

  • 你应该将 city 设为 std::string

标签: c++ istream


【解决方案1】:

您的文件格式似乎暗示城市名称以行尾结尾,而不是空格

您可以使用getline阅读该表格

  char city[100];
  int x , y;
  f.open("map.txt");
  while ( f ) {
      f >> x >> y;         
      f.getline(city, 100); 
  }
  f.close();

【讨论】:

  • 谢谢你的回复,不应该也是一样的变化吗?
  • @Simon 是的!谢谢你抓住那个。请注意,我也简化了代码。 istream 可以单独在a bool context 中使用
  • 谢谢,我是否还需要将 char city[100] 更改为字符串城市; ?
  • @Simon 虽然您不需要,但std::string 提供了许多数组所没有的保护。在这种情况下,你会想要std::getline( f, city );
【解决方案2】:

你可以这样做:

  f.open("map.txt");
  string city;
  int x , y;
  f >> x >> y;
  getline(f,city);

  while (!f.fail()) {
  f >> x >> y;
  getline(f,city);
  }
  f.close();

【讨论】:

    【解决方案3】:

    使用 getline(f, city) 作为城市。所以,你有 f >> x >> y; getline(f, 城市);

    【讨论】:

      【解决方案4】:

      此代码正确读取空格并处理文件结尾。我认为其他答案都没有这样做

      while ((f >> x >> y).getline(city, 100))
      {
      }
      

      有关如何正确测试文件结尾的更多信息,请参阅this

      当然,您应该像其他人所说的那样使用std::string 以简单的方式做事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多