【问题标题】:How to read a file word by word and find the position of each word?如何逐字读取文件并找到每个单词的位置?
【发布时间】:2013-11-15 10:46:09
【问题描述】:

我正在尝试逐字读取文件并对每个单词进行一些实现。将来我想知道每个单词的位置在哪里。位置是该行中的行号和字符位置。如果字符位置不可用,我只需要在转到下一行时知道何时读取文件。这是我现在拥有的示例代码:

string tmp;
while(fin>>tmp){
     mylist.push_back(tmp);
}

我需要知道 fin 什么时候去下一行?!

【问题讨论】:

    标签: c++ string file file-io getline


    【解决方案1】:

    “我需要知道 fin 何时进入下一行”

    这对于流的运算符>> 是不可能的。您可以逐行读取输入,并使用临时istringstream 对象分别处理每一行:

    std::string line, word;
    while (std::getline(fin, line)) {
    
        // skip empty lines:
        if (line.empty()) continue;
    
    
        std::istringstream lineStream(line);
        for (int wordPos = 0; lineStream >> word; wordPos++) {
            ...
            mylist.push_back(word);
        }
    }
    

    别忘了#include <sstream>

    【讨论】:

    • 感谢您的回答,请问单词在每一行的位置如何?有什么解决办法吗?
    • 如果您需要每个单词在程序的不同部分的位置,也许您可​​以考虑改用std::vector< std::vector<std::word> >,即向量线,其中每行都是单词的向量。
    【解决方案2】:

    解决此问题的一种简单方法是使用std::getline,运行您自己的计数器,然后使用附加的string stream 将行的内容拆分为单词,如下所示:

    string line;
    int line_number = 0;
    for (;;) {
         if (!getline(fin, line)) {
             break;
         }
         istringstream iss(line);
         string tmp;
         while (iss >> tmp) {
             mylist.push_back(tmp);
         }
         line_number++;
    }
    

    【讨论】:

    • 感谢您的回答,请问单词在每一行的位置如何?有什么解决办法吗?
    • @Bernard 这个有点棘手,因为多个分隔符被视为一个。如果大致位置可以,您可以随时将 tmps 的长度相加,在每一步的长度上加一以考虑空格。仅当使用单个空格时,该值才是准确的。更好的方法是使用字符串的 find 函数的 temp inside line:这也将考虑多个分隔符。
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多