Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Текстовый режим и файловые потоки


Автор: marknew 12.1.2020, 14:30
Хотел написать самый простейший редактор, но вышло не очень.. Непонятны следующие моменты:
1. Как в текстовом режиме включить, чтобы файловый поток поддерживал как ввод так и вывод?
    fstream fout(filename, ios::in, ios::out); работает некорректно, не очищает остатки файла, т.е. остается мусор от предыдущих записей.
2. Если зайти в программу и сразу выбрать пункт два, то данные прочитаются нормально, если же сначала выбрать пункт 1 и осуществить запись, а затем выбрать пункт два, то ничего не выводится.
    Подправьте, пожалуйста, добавьте чего не хватает, вот мой быдлокод:
   
Код

#include <iostream>
#include <fstream>
using std::cin;
using std::cout;
using std::endl;
using std::ios;
using std::fstream;
//using std::ofstream;
//using std::ifstream;

int get_int (int default_value);

int main() {
    system("chcp 1251 > nul");
    setlocale (LC_ALL, "Russian");

    int age, menu;
    char name[21];
    char filename[81];
    char input_line[111];

    cout << "Enter a file name and press ENTER: ";
    cin.getline(filename,80);
    cout << endl;

    fstream fout(filename, ios::out | ios::in);
        
    if (! fout) {
        cout << "File " << filename;
        cout << " could not be opened." << endl << endl;
        system("pause");
        return -1;
    }

    while(1) {
          cout << "                   МЕНЮ ПРОГРАММЫ:" << endl;
          cout << "1. Сохранить запись" << endl;
          cout << "2. Прочитать запись" << endl;
          cout << "3. Выйти из программы" << endl << endl;

          cout << "Введите пункт меню (1-3) и нажмите Enter: ";
          menu = get_int(3);
          cout << endl;
    
          if (menu == 1) {
              cout << "File " << filename << " was opened." << endl;
              
              while(1) {
                    cout << "Enter name (@@@  to quit): ";
                    cin.getline(name,20);
              
                    if (strcmp(name, "@@@") == 0) {
                        cout << endl;
                        break;
                    }
              
                    cout << "Enter age and press ENTER: ";
                    age = get_int(0);
                    cout << endl;
              
                    fout << name << " " << age << endl;
              }
          
          } else if (menu == 2) {
                     while(1) {
                           fout.getline(input_line, 110);
                           cout << input_line << endl;
                                  
                           if (fout.eof())
                               break;
                     }
          } else {
              cout << "Спасибо, до свидания!" << endl;
              break;
          }
    }

    fout.close();
    
    cout << endl;
    system("pause");
    return 0;
}

int get_int (int default_value) {
    char s[81];
    cin.getline(s,80);

    if (strlen(s) == 0)
        return default_value;

    return atoi(s);
}



Автор: kapbepucm 13.1.2020, 12:57
Цитата(marknew @  12.1.2020,  14:30 Найти цитируемый пост)
если же сначала выбрать пункт 1 и осуществить запись, а затем выбрать пункт два, то ничего не выводится.
После выполнения записи файловый указатель находится в конце и, соотвественно, прочитать ничего не получится, так как впереди больше нет байтов. Можно поиграться с методом seekg, например, поместить указатель в начало файла, ну или в начало последней записи.

Автор: mitchellee95 24.1.2020, 09:15
Here it's easy to get your doubts clear when you are a beginner

Автор: Morfoid 22.2.2020, 13:58
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)