getline循环禁止打印到txt

时间:2018-06-22 03:25:42

标签: c++ string fstream ifstream boolean-expression

我的C ++程序将字符串输入写入txt文件。 我有一个布尔函数check(),它接受输入,并读取文件,如果找到匹配的字符串,则返回true,最后返回false(对于if {}中不返回的情况)。

另一个函数nuc()分析check()的结果,并根据结果写不同的内容。

在运行程序之前,我总是清空fragments.txt,因此check()始终返回false。这是伪代码:

if(check()){
cout << "present" << endl;   
...
}
else{
   cout << "not present" << endl;
   fragments.txt << string;
   counts.txt << int;
}

如果我运行上述代码,程序将提示“不存在”(表示它调用else {}),写入计数文件,但不写入txt文件。

如果我将if(check())替换为if(false),它将如上所述调用else {},将“不存在”表述为计数文件,并写入txt文件。

下面是代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

ifstream sections("sections.txt");
fstream fragments("fragments.txt");
fstream counts("counts.txt");
string fragment;
streampos fragpos;


bool check(string fragment_p) {
    string fragment_r;
    while (getline(fragments, fragment_r)) {
        if (fragment_p == fragment_r) {
            fragpos = fragments.tellg();
            return true;
        }
    }
    return false;
}


void nuc(string section, int position) {
    string fragment_f;
    bool present;
    int count;

    try {
        section.at(position + 1);
        nuc(section, position + 1);
    }

    catch (exception out_of_range) {
        fragment_f = shorten(fragment);

        if (check(fragment_f)) {
            cout << "present" << endl;
            counts.seekp(fragpos);
            counts.seekg(fragpos);
            counts >> count;
        }
        else{
            cout << "not present" << endl;
            fragments << fragment_f << "\n";
            counts << 1 << "\n";
        }
    }
}

编辑:添加main()和示例txt

sections.txt仅包含

BAT

应生成fragments.txt:

(an empty line)
T
A.
AT
B..
B.T
BA.
BAT

而且确实如此,当我用false代替check()调用时。我怀疑问题可能与片段中的读/写位置有关,因为这似乎是唯一受check()影响的东西,但我真的不知道。

main():

            int main() {
                string section;
                size_t pos = 0;

                if (!fragments || !counts || !sections)
                {
                    std::cout << "Error opening files!" << endl;
                    return 1;
                }

                while (getline(sections, section)) {

                    nuc(section, pos);
                }

                std::cout << "fragmentation complete" << endl;

                sections.close();
                fragments.close();
                counts.close();
                system("pause");
                return 0;

编辑2:我注意到,如果我使用/ ** /禁用check()中的getline循环,或者再次作为frassizerr如下所示打开Fragments.txt

        ifstream fragmentsr("fragments.txt", ios::app);

并调用check()(在其getline循环中引用fragmentr而不是片段),程序按预期进行写入,进一步强调了getline循环是造成写入问题的原因。

1 个答案:

答案 0 :(得分:0)

可以check()使片段具有eof标志。