Цикл getline отключает печать в txt

Моя программа на 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 22.06.2018 05:31

@ user4581301 Мне очень жаль, но я не совсем понимаю, что вы имеете в виду?

Kama 22.06.2018 05:50

Вы должны, по крайней мере, предоставить небольшой файл section.txt, который вызывает проблему, которую вы хотите, чтобы мы помогли исследовать, и main для настройки. Если мы изобретем свою собственную, мы не сможем воспроизвести проблему или создадим другую.

user4581301 22.06.2018 07:33

@ user4581301 добавил в OP пример txt и main ()

Kama 22.06.2018 18:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
52
1

Ответы 1

Может check () сделать фрагменты с флагом eof.

while (getline(fragments, fragment_r)) включает тест на конец файла. Если вы предлагаете не это, я рекомендую расширить ответ.
user4581301 22.06.2018 05:32

Этот код заставит fstream иметь флаг eof, и это «плохой бит», вызовите good (), чтобы проверить это. Поток с состоянием! Good () может быть недоступен для чтения.

Binghe Zhai 27.06.2018 07:28

Другие вопросы по теме