我的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;
}
如果我运行上面的代码,程序会“不存在”(意味着它调用else {}),写入计数文件,但不写入txt文件 .
如果我用if(false)替换if(check()),则如上所述调用else {},couting“not present”写入计数文件,AND写入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
应该导致fragment.txt:
(an empty line)
T
A.
AT
B..
B.T
BA.
BAT
它确实,当我用false替换check()调用 . 我怀疑这个问题可能与片段中的读/写位置有关,因为这似乎是受check()影响的唯一因素,但我真的不知道 .
主要():
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作为碎片,如下所示
ifstream fragmentsr("fragments.txt", ios::app);
并调用check()(在其getline循环中引用fragmentr而不是片段),程序按预期写入,进一步强调getline循环负责写入问题 .
1 回答
可以check()使片段有eof标志 .