Проблемы с текстовыми файлами (Visual C++)

Я пытаюсь сделать так, чтобы программа запрашивала у пользователя имя файла, а затем спрашивала, какое слово они хотели бы удалить. Есть ли способ сделать это, не выполняя никаких функций вне main? (Заранее спасибо!) Вот мой код:

ofstream outFile;
string in;
char in2[800];
char fileName = ' ';
while (in != "XXXX") {
    cout << "What do you want to name the file? Enter a name or enter XXXX to quit.\n";
    cin >> in;

    for (int i = 0; i < in.length(); i++)
    {
        fileName += in[i];
    }
    outFile.open(in + ".txt");
    if (outFile.fail())
    {
        outFile << "Can't do it.";
    }
    else
    {
        cout << "What do you want in it?\n";
        cin >> in2;
        cin.getline(in2, sizeof(in2));
        outFile << in2;
    }
    outFile.close();
    ifstream reader;
    string oneLine;
    reader.open(in + ".txt");
    if (reader.fail())
    {
        cout << "Could not read file.\n";
        return 0;
    }
    else
    {
        reader.clear();
        reader.seekg(60L, ios::beg);
        getline(reader, oneLine);
        cout << "Is there something you'd like to remove from " << in << ".txt?\n";
        cin >> in2;
        ofstream write("tmp.txt");
        while (getline(reader, oneLine)) {
            if (oneLine != in2)
                write << oneLine << endl;
        }
        reader.close();
        write.close();
        remove(fileName + ".txt");
        rename("tmp.txt", fileName + ".txt");
        return 0;
    }
    return 0;
}

Извинения. Неправильно прочитал. in2 был массивом char, а не in.

user4581301 16.11.2018 23:14

Есть ли причина, по которой вам не нужны функции? Они почти всегда более желательны с точки зрения разделения ответственности и читабельности кода.

user4581301 16.11.2018 23:16

Проработайте свой код построчно и поймите, что делает каждый оператор. fileName + = in [i] не делает то, что вы, вероятно, делаете, за исключением этого.

Hristijan Gjorshevski 16.11.2018 23:30

@Hristijan Gjorshevski тоже не умеет делать это со своим файлом << "cant do it"; в этом конкретном блоке кода.

johnathan 17.11.2018 02:30
Стоит ли изучать 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
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
while (in != "XXXX") {
    cout << "What do you want to name the file? Enter a name or enter XXXX to quit.\n";
    ...
}

Если вы введете XXXX, цикл не прекратится. Он попытается обработать остальную часть кода.

char fileName = ' '; объявляет одиночный символ. Вам нужен массив символов. А еще лучше объявить его как std::string fileName;

remove(fileName + ".txt"); не компилируется, потому что remove - это функция C. C не поддерживает классы и не знает, что делать с такими классами, как std::string. Вы хотите предоставить C-строку, вы можете сделать это с помощью fileName.c_str(). Ниже приведены несколько предложений:

int main()
{
    ofstream outFile;
    string fileName;
    string text;
    for(;;)
    {
        cout << "What do you want to name the file?\n";
        cout << "Enter a name or enter 999 to quit.\n";
        cin >> fileName;

        if (fileName == "999")
            break;

        fileName += ".txt";
        outFile.open(fileName);
        if (outFile.fail())
        {
            cout << "Can't do it.";
            continue;
        }
        else
        {
            for(;;)
            {
                cout << "What do you want in it?\n";
                cout << "Enter a name or enter 999 to stop.\n";
                cin >> text;
                if (text == "999")
                    break;
                outFile << text << endl;
            }
        }
        outFile.close();

        ifstream reader;
        reader.open(fileName);
        if (reader.fail())
        {
            cout << "Could not read file.\n";
        }
        else
        {
            cout << "Is there something you'd like to remove from " << fileName << "?\n";
            cin >> text;

            string oneLine;
            ofstream write("tmp.txt");
            while(getline(reader, oneLine)) 
            {
                if (oneLine != text)
                    write << oneLine << endl;
            }
            reader.close();
            write.close();

            remove(fileName.c_str());
            rename("tmp.txt", fileName.c_str());
            break;
        }
    }
}

Спасибо, Бармак! Это работает именно так, как я хотел.

Paul Pulcini 18.11.2018 17:52

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