Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ввод/вывод файла в массив, ifstream,ofstream 
:(
    Опции темы
Slyfox
Дата 10.12.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



В текстовый файл нужно вводить ФИО (fio) и зарплату (zarplata)

записываю построчно, т.е. 1-ая строка fio, 2-ая - zarplata, 3-я опять fio,  4-я сново zarplata........и так сколько нужно.

ofstream outfile("test.txt");
for (int g=0;g<9;g++) outfile << "Familia Imia Otchestvo\n3456\n";
outfile.close();

Потом напишу нормальный ввод пользователем с клавиатуры.


Не получается считывать в массив из файла.  Помогите. Знаю, чтобы считывать строки с пробелами  до конца файла нужно использовать
ifstream infile("test.txt");
while(!infile.eof()){
.............
infile.getline(.........................);
.............
}

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

Заранее спасибо.

P.S. с записью в текстовый файл думаю у меня проблем не должно быть, а вот считывание в массивы(или структуру или класс ------- мне хотя бы сделать двумя массивами)
mas_fio и mas_zarplata - это проблема

Это сообщение отредактировал(а) Slyfox - 10.12.2007, 09:50
PM MAIL   Вверх
Slyfox
Дата 10.12.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Дайте хотя бы ссылку - т.е. почитать про вывод файлов в массивы
PM MAIL   Вверх
_stranger_
Дата 10.12.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: нет
Всего: 2



как пример:
Код


#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int main()
{
   std::vector<std::string> buf;
   std::ifstream infile("test.txt", std::ios::in);
   std::string str;
   while(std::getline(infile,str,' ')) buf.push_back(str);
   std::copy(buf.begin(),buf.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
}

PM MAIL   Вверх
bsa
Дата 10.12.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Slyfox, делаешь структуру:
Код
#include <string>
#include <istream>
#include <ostream>

struct Data
{
      std::string name; // ФИО
      std::string pay;  // з/п
      Data(){}
      Data(const std::string &n, const std::string &p) : name(n), pay(p){}
};
Теперь делаешь для нее операторы загрузки/сохранения в поток:
Код
std::istream& operator>>(std::istream &stream, Data &data)
{
      std::getline(stream, data.name);
      std::getline(stream, data.pay);
      return stream;
}
std::ostream& operator<<(std::ostream &stream, Data &data)
{
      return stream << data.name << "\n" << data.pay << "\n";
}
Ну, а дальше, думаю, все и так понятно.
PM   Вверх
Slyfox
Дата 10.12.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Код
#include <conio.h>
#include <string>
#include <iostream>
#include <fstream>
#include "windows.h"
using namespace std;

char strTemp[240];
char* Rus(char* strUk)
{
    CharToOem(strUk,strTemp);
    return strTemp;
}

struct ZARPL{
    char fio;
    int zarplata;
    int tn;
    char dolznost; 
}z[70];

main()
{
    const int MAX=80;
    char buffer[MAX];
    int kol;

    cout << Rus("Введите количество работников, которые будут введены в таблицу ");
    cin >> kol;
    for (int i=0;i<kol;i++){
        cout << Rus("Введите данные о работнике №") << (i+1) << '\n';
        cin >> z[i].zarplata;
        cout << z[i].zarplata;
    }
    ofstream out("zaplati.txt");
    for (int i=0;i<kol;i++) out << z[i].zarplata;
    out.close();

    /*ifstream in("zaplati.txt");
    while(in){
        in.getline(buffer,MAX);
        cout << Rus(buffer) << '\n';
    }
    in.close();*/

    getch();
    return 0;
}


не знаю почему, но не записывает в файл :(

Помогите.
Все дело в структуре как мне кажется - не пишется в файл.
Вся надежда на ваш опыт. Visual C++6.
PM MAIL   Вверх
JackYF
Дата 10.12.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(Slyfox @  10.12.2007,  23:44 Найти цитируемый пост)
но не записывает в файл :(

файл создаётся пустым? вообще не создаётся?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Slyfox
Дата 11.12.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата(JackYF @ 10.12.2007,  23:58)
Цитата(Slyfox @  10.12.2007,  23:44 Найти цитируемый пост)
но не записывает в файл :(

файл создаётся пустым? вообще не создаётся?

не компилируется программа

попробовал сделать вместо структуры - int nadezda[70]; - тоже не компилируется программа

Добавлено через 1 минуту и 44 секунды
Вот выдает

c:\Program Files\Microsoft Visual Studio\MyProjects\sotrudnik\sotrudnik.cpp(41) : error C2374: 'i' : redefinition; multiple initialization

        c:\Program Files\Microsoft Visual Studio\MyProjects\sotrudnik\sotrudnik.cpp(32) : see declaration of 'i'

PM MAIL   Вверх
bsa
Дата 11.12.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Slyfox, выкинь VC6 - он не соответствует стандарту. В твоем случае, он не позволяет сделать:
Код
for(int i = 0; i < 10; ++i){}
for(int i = 0; i < 100; ++i){}
Говорит, что i определена дважды - т.е. он ее выносит за оператор for(), что не должен бы делать.
PM   Вверх
Slyfox
Дата 11.12.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата(bsa @ 11.12.2007,  00:05)
Slyfox, выкинь VC6 - он не соответствует стандарту. В твоем случае, он не позволяет сделать:
Код
for(int i = 0; i < 10; ++i){}
for(int i = 0; i < 100; ++i){}
Говорит, что i определена дважды - т.е. он ее выносит за оператор for(), что не должен бы делать.

нельзя - реализация именно в этой среде попоытаюсь переменную вынести


вынес --- пока все OK
продолжаю играть с файлами дальше

Предположение: наверное из-за не установленного к VS6 сервис пака 6
Счас обновлю и проверю на всякий по старому способу

Это сообщение отредактировал(а) Slyfox - 11.12.2007, 00:24
PM MAIL   Вверх
zkv
Дата 11.12.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



я уже приучился немного кросс-студийный код писать:  smile 
Код

int i;
for( i = 0; i < 10; ++i){}
for( i = 0; i < 100; ++i){}

работает в 6-м, 7-м и 8-м VC++, MS умудрились во все эти три версии разное поведение заложить насчет видимости переменных.

Это сообщение отредактировал(а) zkv - 11.12.2007, 00:21
PM MAIL   Вверх
Slyfox
Дата 11.12.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Код
#include <conio.h>
//#include <string>
#include <iostream>
#include <fstream>
#include "windows.h"
using namespace std;

char strTemp[240];
char* Rus(char* strUk)
{
    CharToOem(strUk,strTemp);
    return strTemp;
}

struct ZARPL{
    int zarplata;
    int tn;
    char fio[21]; //Фамилия
    char dolznost[21]; // Должность
}z[70];

main()
{
    const int MAX=80;
    char buffer[MAX];
    int kol;

    cout << Rus("Введите количество работников, которые будут введены в таблицу ");
    cin >> kol;
    int i=0;
    for (;i<kol;i++){
        cout << "\n";
        cout << Rus("Введите данные о работнике №") << (i+1) << '\n';
        cout << Rus("Зарплата ");
        cin >> z[i].zarplata;
        cout << Rus("Табельный номер ");
        cin >> z[i].tn;

        cout << Rus("ФИО ");
        cin >> z[i].fio;
        cout << Rus("Должность ");
        cin >> z[i].dolznost;
        gets(z[i].fio);
        gets(z[i].dolznost);
    }
    ofstream out("zaplati.txt");
    i=0;
    for (;i<kol;i++) out << z[i].zarplata << '\n' << z[i].tn << '\n' << z[i].fio << '\n' << z[i].dolznost << '\n';
    out.close();

    /*ifstream in("zaplati.txt");
    while(in){
        in.getline(buffer,MAX);
        cout << Rus(buffer) << '\n';
    }
    in.close();*/

    getch();
    return 0;
}

Что-то не так с
char fio[21]; //Фамилия
char dolznost[21]; // Должность
т.е. при сохранении. Что я сделал не так и как надо? Не то сохраняет в файл особенно если есть пробелы.
Помогите.
PM MAIL   Вверх
zkv
Дата 11.12.2007, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Цитата(Slyfox @  11.12.2007,  01:27 Найти цитируемый пост)
Что-то не так с

что именно не так? Догадываться прикажете?
PM MAIL   Вверх
Slyfox
Дата 11.12.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата(zkv @ 11.12.2007,  01:37)
Цитата(Slyfox @  11.12.2007,  01:27 Найти цитируемый пост)
Что-то не так с

что именно не так? Догадываться прикажете?

Ввожу везде 1 (единицы)
В файле должно получится четыре штуки единиц

В файле получается две штуки единиц в 2-х строках (вместо 4-х)

Добавлено через 8 минут и 36 секунд
Думаю, что gets можно убрать, а продолжать использовать cin --- т.е. есть установить какой-нидь флаг в нем, который можно установить и разрешить вводить с пробелами в  переменные типа char[21], а потом установить опять флаг как было для чисел. Может это мне поможет? Знал бы еще какой флаг и как установить. Возможно вы знаете решение? Может есть другая функция?

Это сообщение отредактировал(а) Slyfox - 11.12.2007, 01:41
PM MAIL   Вверх
bsa
Дата 11.12.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Slyfox, ты уверен, что у тебя записывается без пробелов, а не читается без пробелов?
operator>> - выполняет ввод слова, а не строки. Используй istream::getline()
PM   Вверх
Slyfox
Дата 11.12.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата(bsa @ 11.12.2007,  12:12)
Slyfox, ты уверен, что у тебя записывается без пробелов, а не читается без пробелов?
operator>> - выполняет ввод слова, а не строки. Используй istream::getline()

Как ею пользоваться?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.