Форум программистов, компьютерный форум CyberForum.ru

Файловые потоки - C++

Восстановить пароль Регистрация
 
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
21.05.2014, 23:42     Файловые потоки #1
Структура
C++ (Qt)
1
2
3
4
5
6
7
8
9
enum status {Boss=1, Manager};
 
struct Worker
      {
           
            string Name;
            int Year;
            status Status;
      };
записана в файл. Пользователь вводит номер строки, которую нужно редактировать. Редактируем,перезаписываем файл. Не могу понять, как реализовать это дело.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2014, 23:42     Файловые потоки
Посмотрите здесь:

C++ Файловые потоки и функции
Бинарные файловые потоки C++
C++ Файловые потоки
Файловые потоки C++
C++ Бинарные файловые потоки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.05.2014, 23:52     Файловые потоки #2
Цитата Сообщение от luigration Посмотреть сообщение
записана в файл.
Как записана?
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.05.2014, 20:43  [ТС]     Файловые потоки #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Как записана?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 ifstream in;
      ofstream out;
 
      in.open("work.txt", ios::in);
      out.open("work.txt", ios::app|ios::out);
      
      if(!out)
      {
        cout << "error";
      }
 
      out << "Name\t\tYear\t\tStatus" << endl << endl;
      for(int i(0); i<N; i++)
        {
            out << emp[i].Name << "\t\t" << emp[i].Year << "\t\t";
 
            switch(emp[i].Status)
            {
            case 1: out << "Boss\n"; break;
            case 2: out << "Manager\n"; break;
            
            }
            out << endl;
        }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 21:02     Файловые потоки #4
Вот это в файл не нужно записывать:
C++
1
out << "Name\t\tYear\t\tStatus" << endl << endl;
В 23 строке out << endl лишний.
Цитата Сообщение от luigration Посмотреть сообщение
Пользователь вводит номер строки, которую нужно редактировать. Редактируем,перезаписываем файл. Не могу понять, как реализовать это дело.
Читаете данные из файла в массив структур (используя оператор >>), находите нужную, редактируете, открываете файл для записи (без ios::app), записываете массив в файл.
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.05.2014, 21:10  [ТС]     Файловые потоки #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это в файл не нужно записывать:
C++
1
out << "Name\t\tYear\t\tStatus" << endl << endl;
В 23 строке out << endl лишний.

Читаете данные из файла в массив структур (используя оператор >>), находите нужную, редактируете, открываете файл для записи (без ios::app), записываете массив в файл.
Не лишний. Иначе все в строку будет.

Добавлено через 40 секунд

Я прекрасно понимаю, что нужно считать, найти строку, перезаписать, но КАК?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 21:16     Файловые потоки #6
Цитата Сообщение от luigration Посмотреть сообщение
Не лишний. Иначе все в строку будет.
Это разве не переход на новую строку ('\n'):
C++
1
case 1: out << "Boss\n";
Цитата Сообщение от luigration Посмотреть сообщение
Я прекрасно понимаю, что нужно считать, найти строку, перезаписать, но КАК?
Что КАК?

Добавлено через 4 минуты
Как найти? По индексу в массиве. Как считать? Как записываете, только чтение. Как записать? Как у вас в коде.
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.05.2014, 21:28  [ТС]     Файловые потоки #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Это разве не переход на новую строку ('\n'):
C++
1
case 1: out << "Boss\n";
Что КАК?

Добавлено через 4 минуты
Как найти? По индексу в массиве. Как считать? Как записываете, только чтение. Как записать? Как у вас в коде.
Один человек - одна строка.
Не понимаю, как ходить по строкам, как перезаписать одну строку или структуру с новой строкой.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 21:35     Файловые потоки #8
Цитата Сообщение от luigration Посмотреть сообщение
Один человек - одна строка.
Один человек - одна структура (она же - строка в файле).
Цитата Сообщение от luigration Посмотреть сообщение
Не понимаю, как ходить по строкам,
По индексам, в массиве структур.
Цитата Сообщение от luigration Посмотреть сообщение
как перезаписать одну строку или структуру с новой строкой.
Ваш код, в цикле for(), на каждой итерации, в файл записывается одна структура (она же - строка в файле) из массива структур emp.
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.05.2014, 21:48  [ТС]     Файловые потоки #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Один человек - одна структура (она же - строка в файле).

По индексам, в массиве структур.

Ваш код, в цикле for(), на каждой итерации, в файл записывается одна структура (она же - строка в файле) из массива структур emp.
Да со структурой проблем нет. Как в файле ходить по строкам? Как считывать? Как изменять?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2014, 22:00     Файловые потоки #10
Цитата Сообщение от luigration Посмотреть сообщение
Как в файле ходить по строкам?
Не нужно там ходить, в массиве структур, когда считаете файл, будете ходить(по индексам).
Цитата Сообщение от luigration Посмотреть сообщение
Как считывать?
Цитата Сообщение от alsav22 Посмотреть сообщение
Как записываете, только чтение.
Цитата Сообщение от alsav22 Посмотреть сообщение
Читаете данные из файла в массив структур (используя оператор >>)
Цитата Сообщение от luigration Посмотреть сообщение
Как изменять?
Находите в массиве нужную структуру, переписываете нужное поле (или все поля) структуры.

Добавлено через 48 секунд
Последний пост. Надоело из пустого в порожнее переливать...
luigration
2 / 2 / 0
Регистрация: 04.01.2013
Сообщений: 154
22.05.2014, 22:21  [ТС]     Файловые потоки #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Не нужно там ходить, в массиве структур, когда считаете файл, будете ходить(по индексам).




Находите в массиве нужную структуру, переписываете нужное поле (или все поля) структуры.

Добавлено через 48 секунд
Последний пост. Надоело из пустого в порожнее переливать...
Понту тогда записывать в файл? Задача-то на работу с файлами. Это как-то через функции seekp, seekq делается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2014, 22:32     Файловые потоки
Еще ссылки по теме:

C++ Файловые потоки
файловые потоки C++
C++ Файловые потоки в Си и С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
22.05.2014, 22:32     Файловые потоки #12
Цитата Сообщение от luigration Посмотреть сообщение
Это как-то через функции seekp, seekq делается.
Делается...
Только в двоичном режиме открытие файла и структура не должна использовать string и другие "сложные" типы.

Т.е структура должна выглядеть приблизительно так
C++
1
2
3
4
5
6
struct Worker
{           
    char Name[256];
    int Year;
    int Status;
};
Читать/записывать через:

http://www.cplusplus.com/reference/i.../read/?kw=read
http://www.cplusplus.com/reference/o...rite/?kw=write

Если размер структуры фиксирован и всегда известен, всегда можно перейти к N-записи в файле = N* sizeof(Worker).

Одно "но" - при записи в двоичном режиме - файл становится не читабельным для человека (если откроете в блокноте ничего не поймете)
Yandex
Объявления
22.05.2014, 22:32     Файловые потоки
Ответ Создать тему
Опции темы

Текущее время: 23:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru