Моя программа на C++ записывает строковые данные в текстовый файл. У меня есть функция bool check (), которая принимает входные данные и читает файл, возвращая истину, если она находит совпадающую строку, и заканчивается возвращением 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 {}, как указано выше, couting "not present" записывает в файл счетчика И записывает в файл 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
section.txt, содержащий только
BAT
должен получиться файл fragments.txt:
(an empty line)
T
A.
AT
B..
B.T
BA.
BAT
И это так, когда я заменяю вызов check () на false. Я подозреваю, что проблема может иметь какое-то отношение к позициям чтения / записи во фрагментах, поскольку это, кажется, единственное, на что влияет 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;
Обновлено еще раз: Я заметил, что если я отключу цикл getline в check () с помощью / ** / или открою fragments.txt во второй раз как фрагмент, как показано ниже
ifstream fragmentsr("fragments.txt", ios::app);
и вызовите check () (ссылаясь на fragmentsr в своем цикле getline вместо фрагментов), программа пишет как задумано, дополнительно подчеркивая, что цикл getline отвечает за проблему записи.
@ user4581301 Мне очень жаль, но я не совсем понимаю, что вы имеете в виду?
Вы должны, по крайней мере, предоставить небольшой файл section.txt, который вызывает проблему, которую вы хотите, чтобы мы помогли исследовать, и main для настройки. Если мы изобретем свою собственную, мы не сможем воспроизвести проблему или создадим другую.
@ user4581301 добавил в OP пример txt и main ()





Может check () сделать фрагменты с флагом eof.
while (getline(fragments, fragment_r)) включает тест на конец файла. Если вы предлагаете не это, я рекомендую расширить ответ.
Этот код заставит fstream иметь флаг eof, и это «плохой бит», вызовите good (), чтобы проверить это. Поток с состоянием! Good () может быть недоступен для чтения.
Я рекомендую предоставить или жестко запрограммировать набор входных данных, который раскрывает вашу сообщенную ошибку.