【问题标题】:Reading input chars from single line of a file从文件的单行读取输入字符
【发布时间】:2013-12-18 14:05:55
【问题描述】:

所以我的任务是从文件中读取一行 示例:

4. 7 3-+ 2 -3+

并将其一一输入到字符串变量中。

一个问题是数字和符号之间有 0 个或多个空格,但一个数字和另一个数字之间至少有 1 个空格。那么如何区分每个数字/符号呢?

【问题讨论】:

  • 剪掉所有空格并读入。如果有空格,则将阅读器的位置更改+1。
  • <cctype> 标头包含 isalphaisdigit 等内容,这可能会有所帮助。如果您需要适当的本地化,您可以使用C++ locales 获得基本相同的内容。
  • 如果数字是双格式怎么办?这不会是个问题吗?

标签: c++ inputstream


【解决方案1】:

我建议您通过 getline() 阅读整行,然后按字符解析字符串,并可能构建另一个字符串。

cin.getline( myString );
for ( int i = 0; i < myString.size(); i++ ) {
  if ( myString[i] != ' ' ) {

    if ( myString[i] >= '0' && myString[i] <= '9' {
      // do something with numbers;
    } else {
      // do something with characters.
    }

  }
}

其他选项是逐个字符读取。这些解决方案仅适用于单个数字。对于多于一位的数字,您将不得不再次逐个字符地构建数字。

char ch;
cin >> std::noskipws; // needed to recognize the end of line character.
while ( cin >> ch && ch != '\n' ) {
  if ( ch != ' ' ) {

    if ( ch >= '0' && ch <= '9' {
      // do something with numbers;
    } else {
      // do something with characters.
    }

  }
}
cin >> std::skipws;

【讨论】:

  • 我认为这正是我想要的。谢谢你!就一个问题。假设我要将所有这些 1 x 1 放入向量中,那么我如何将 4.5 之类的数字插入向量中的一个块中?
  • 当然,这意味着他最后的-3会被解析为一个符号,后跟一个数字。而且这些数字将只是一个数字。我曾想过大致相同的事情(但使用getline,然后在istringstream 上使用&gt;&gt;,这会自动跳过空白),但发现我需要多个字符前瞻。
  • @user3115535 您需要逐个字符地解析数字。例如,如果您遇到 4,您将需要跟踪未来的字符,直到您不断收到 '.'。或更多数字。
  • @JamesKanze 是的,所以“-”号应被视为可能的“多于一位数字”。另外,如果使用了stringstream,则不会跟踪数字和字符的相对顺序。
  • 这个作业不包括负数,所以我在那部分有点幸运,所以我设法把整行变成了一个向量,现在我可以跟踪下一个索引了。
【解决方案2】:

在 C++ 中,您可以使用 getline() 将整行读入字符串。现在字符串支持find_first_of()find_first_not_of(),允许有效地读取直到空白然后跳过它。

未测试:

string delims = " \t"
getline(file, line);
int tokenStart, tokenEnd = 0;
string token;
tokenStart = line.find_first_not_of(delims, tokenEnd);
tokenEnd = line.find_first_of(delims, tokenStart);
// substr expects length, not end of substring
token = line.substr(tokenStart, tokenEnd-tokenStart);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多