【发布时间】: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