c++ - 为什么使用 while(!input.eof()) 循环两次不起作用?

标签 c++ iostream

<分区>

下面几行代码的目的是将输入文本文件中的每个单词(单词之间用换行符分隔)放入一个字符串 vector 中,然后将每个单词翻转过来,看看这个翻转后的单词是否是包含在输入文件的单词列表中。

我相信我的二进制搜索功能和 wordTurn 功能可以正常工作。 我对我的代码做了几个简单的测试,我发现使用 while(!myFile.eof()) 循环两次可能是我的代码不工作的原因。不工作是指我将输出文件(“pairs.txt”)作为一个空文档(它应该是一个单词对列表)。

也就是说,当我在第二个 while(!myFile.eof()) 循环体中放入一些简单的打印代码时,它并没有被打印出来,由此我得出结论,这个循环没有到达。这更有可能,因为它是在我注释掉第一个 while(!myFile.eof()) 循环时打印的。我最初将第一个 while 循环放在 else 主体中,但这没有任何区别。

您认为问题是什么? 我尝试将这两个循环体组合到第二个循环中,它在输出文件中产生了一些东西,但这不是这段代码应该做的,而且这在逻辑上是不正确的。

如有任何建议,我们将不胜感激。

int main(int argc, char* argv[]) {

    vector<string> words;
    ifstream myFile(argv[1]);
    ofstream outputFile("pairs.txt");
    string vocab;
    string s;
    int count;

    while(!myFile.eof()) {                //first while(!myFile.eof()) loop
        getline(myFile, s);
        words.push_back(s);
    }

    if(argc != 2) {
        cout << "Usage: provide the name of one input file after the dictlookupHN executable file." << endl;
        return (1);
    }
    else {
        if(!myFile.is_open()) {
            cerr << "Error: unable to open file " << argv[1] << endl;
            return (1);
        }
        else {
            while(!myFile.eof()) {      //second while(!myFile.eof()) loop
                getline(myFile, vocab);
                string turnedWord = wordTurn(vocab);
                if(binsearch(words, turnedWord) != "") {
                    outputFile << vocab << ":" << turnedWord << endl;
                    count++;
                }
            }
        }

    }
    myFile.close();
    outputFile.close();

    return 0;
}

最佳答案

ifstream 类维护流数据的内部偏移量,跟踪它必须从何处读取,以用于下一个操作。

当此偏移量到达末尾时,它会停止第一个循环,(eof() 返回 false)。在再次阅读之前,您需要将此内部位置重置回文件的开头。

你可以这样说:

myFile.clear(); // clear stream flags and error state
myFile.seekg(0, ios::beg); // reset read position

在第二个循环之前。

编辑:添加了对 clear() 的调用。

关于c++ - 为什么使用 while(!input.eof()) 循环两次不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162189/

相关文章:

C++ std::string 参数是 <Bad Ptr>

c++ - hana::tuple to auto && ... args

c++ - 无法包装 std::istream,移动后 unique_ptr 不为空

c++ - 直接从 std::istream 读取到 std::string

c++ - 用 iostream 运算符填充缓冲区

C++编译器不识别头文件

C++:可以在构造函数中初始化 boost::scoped_ptr 吗?

c++ - 我的MDI中的拖放操作被CRichEditView拦截,并在CRichEditView::GetDocument中崩溃-如何覆盖它?

c++ - 什么时候应该使用字符串而不是字符串流?

c++ - 从 .txt 文件中获取混合数值