【问题标题】:getline loop disables printing to txtgetline 循环禁用打印到 txt
【发布时间】:2018-06-22 03:25:42
【问题描述】:

我的 C++ 程序将字符串输入写入 txt 文件。 我有一个 bool 函数 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;
}

如果我按照上面的代码运行,程序 couts “不存在”(意味着它调用 else{}),写入计数文件,但不写入 txt 文件。

如果我用 if(false) 替换 if(check()),它会像上面一样调用 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

确实如此,当我将 check() 调用替换为 false 时。我怀疑这个问题可能与片段中的读/写位置有关,因为这似乎是唯一受 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 循环,或者第二次打开 Fragments.txt 作为 Fragmentsr,如下所示

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

并调用 check()(在其 getline 循环中引用 Fragmentsr 而不是 Fragments),程序按预期写入,进一步强调 getline 循环负责写入问题。

【问题讨论】:

  • 我建议提供或硬编码一个输入集,以暴露您报告的错误。
  • @user4581301 很抱歉,我不太清楚你的意思?
  • 您至少应该提供一个小sections.txt,它会导致您希望我们帮助调查的问题,并提供一个main 来进行设置。如果我们自己发明,我们可能无法重现问题,或者可能产生不同的问题。
  • @user4581301 将示例 txt 和 main() 添加到 OP

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


【解决方案1】:

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

【讨论】:

  • while (getline(fragments, fragment_r)) 包括对文件结尾的测试。如果这不是您的建议,我建议您扩展答案。
  • 这段代码会使 fstream 有 eof 标志,这是一个“坏比特”,调用 good() 来检查它。具有 !good() 状态的流,它可能无法读取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多