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

Поиск:

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


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


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

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



Цитата(Slyfox @  11.12.2007,  17:06 Найти цитируемый пост)
Как ею пользоваться? 

неужели сложно посмотреть в документации?


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


Шустрый
*


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

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



Я наверное не так объяснил.

cin.getline (z[i].fio,MAX);   ------------- ничего в файл не пишет(программа скомпилировалась).

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


Эксперт
****


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

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



getline читает строку из файла!
cin.getline() - читает строку с клавиатуры (стандартного ввода)
PM   Вверх
Slyfox
Дата 11.12.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как мне считать в массив z[i].fio строку введенную с клавиатуры вместе с пробелами?
PM MAIL   Вверх
bsa
Дата 11.12.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Slyfox @ 11.12.2007,  18:45)
А как мне считать в массив z[i].fio строку введенную с клавиатуры вместе с пробелами?

cin.getline(z[i].fio, 21);
PM   Вверх
Slyfox
Дата 11.12.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @ 11.12.2007,  18:48)
Цитата(Slyfox @ 11.12.2007,  18:45)
А как мне считать в массив z[i].fio строку введенную с клавиатуры вместе с пробелами?

cin.getline(z[i].fio, 21);

Вот в этом месте у меня в файл не пишет - не пишет  z[i].fio
что-то не то

но программа скомпилировалась

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


Эксперт
****


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

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



Ты меня что спросил? Как считать строку! А не как записать! Разницу чувствуешь? Я тебе ответил на вопрос, как прочитать строку с пробелами.
Записать можно с помощью operator<<: cout << z[i].fio
PM   Вверх
Slyfox
Дата 11.12.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <conio.h>
#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.getline(z[i].fio,21);
        cout << z[i].fio;
    }
    ofstream out("zaplati.txt");
    i=0;
    
    for (;i<kol;i++) out << 
        //z[i].zarplata << '\n' << z[i].tn << '\n' << 
        z[i].fio << '\n';
    
    out.close();

    getch();
    return 0;
}



Мне тяжело объяснить, но думаю, что я остался не понятым.

----1)--  cin.getline(z[i].fio,21);
----2)--  cout << z[i].fio;
1) Тут пытаюсь записать в массив строку с пробелами
2) И сразу вывести то, что в нем находится, чтобы быть точно уверенным что все правильно записывает

Как только я ввожу "Введите количество работников, которые будут введены в таблицу" - число 1
"Введите данные о работнике №" - ввожу первый символ, только я ввожу этот символ как программа не понятно почему закрывается. При этом создается файл пустой который занимает 2байта.

Как только я ввожу "Введите количество работников, которые будут введены в таблицу" - число 2
"Введите данные о работнике №" - ввожу первый символ - второй при этом не приходится вводить он сам становится идентичным 1-ому. При этом создается файл состоящий из двух строк: первая строка пустая,  во второй записан первый введенный символ. Также ограничения одним символом.

Где у меня ошибка? Помогите. Пожалуйста.

Чем дальше тем непредсказуемее...
PM MAIL   Вверх
mrbrooks
Дата 11.12.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Для начала посмотри мой код. Я малость  тебя подправил. В данном случае программа записывает значения в файл. Но учти - вводимый тобой русский текст отображаться не будет. Надо обрабатывать строки в функции OemToChar.
Ошибок у тебя много. Особенно со структурой.
Будут вопросы спрашивай.

Код

using namespace std;

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

struct zarplata
{
    char *fio;
    int zarplata;
    int tn;
    char dolznost[250];
};

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
struct zarplata *newzarlata = new zarplata;
    int kol;
    cout << Rus("Введите количество работников, которые будут введены в таблицу ");
    cin >> kol;
    int i=1;
      ofstream outfile("zarplata.txt");
    while (i<=kol)
    {
      cout << Rus("Введите данные о работнике №") << i << endl;
      cout << Rus("Фамилия: ");
      cin >> newzarlata->fio;
      cout << Rus("Должность: ");
      cin >> newzarlata->dolznost;
      cout << Rus("З/П: ");
      cin >> newzarlata->zarplata;
      outfile << newzarlata->fio << ' '<< newzarlata->dolznost
              << ' ' << newzarlata->zarplata << endl;
      cout << Rus("Записано : ") << newzarlata->fio << ' '<< newzarlata->dolznost
                << ' ' << newzarlata->zarplata << endl;
      i++;
    }
    outfile.close();
    cout << Rus("Конец программы!") << endl;
    cin.get();
    cin.get();
    delete newzarlata;
    return 0;
}
//---------------------------------------------------------------------------



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


Шустрый
*


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

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



Код пока предложенный не проверял.

Но первое что бросилось в глаза

char *fio;
........
char dolznost[250];

почему они такие разные, это к чему, т.е. зачем?
PM MAIL   Вверх
mrbrooks
Дата 11.12.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Считай это моей прихотью. Это я чисто для себя сделал. По большому счету конечно можешь оставить так как у тебя  - вполне хватит 21 элемента. Указатель на char значит - что массив у тебя безразмерный (естественно ограничивается типом).В кратце -  если вдруг фамилия больше 21 знаков он и создат строку более 21 знака. 
В твоем случае ты не правильно записываешь данные в структуру. Это надо делать через функцию strcpy(куда_копируешь, что_копируешь) либо использовать как я указатель.
PM MAIL   Вверх
likehood
Дата 11.12.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(mrbrooks @  11.12.2007,  22:19 Найти цитируемый пост)
если вдруг фамилия больше 21 знаков он и создат строку более 21 знака. 

если бы это была строка класса std::string то так бы и было. А для сишных строк надо выделять память самому, cin это за тебя не сделает. Так что вместо char *fio нужно писать char fio[250] (или другой размер, не важно).
PM MAIL   Вверх
mrbrooks
Дата 11.12.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата

если бы это была строка класса std::string то так бы и было. А для сишных строк надо выделять память самому, cin это за тебя не сделает. Так что вместо char *fio нужно писать char fio[250] (или другой размер, не важно).


тогда что бы убедится в вашей правоте скажите почему char *fio  работает? и причем без проблем?

Бьерн Страуструп пишет
Цитата

Строка может быть объявлена как массив символов, либо как переменная типа char*. Приведенные ниже примеры эквивалентны:
char s[5] = "abcde";
char s[] = "abcde";
char *s = "abcde";


Парируйте если можете тов. likehood  smile 

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


666
**


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

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



Цитата(mrbrooks @  11.12.2007,  23:07 Найти цитируемый пост)
Бьерн Страуструп пишет

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


Цитата(mrbrooks @  11.12.2007,  23:07 Найти цитируемый пост)
скажи почему char *fio  работает?

работает до поры до времени.
Попробуй выполнить такой код в дебаг-версии:
Код

#include <iostream>
using namespace std;

int main()
{
    char *str;
    cin >> str;
    cout << str << "\n";
    return 0;
}


У меня в студии выдается ошибка, что я исползьую переменную str без инициализации.

Добавлено через 3 минуты и 46 секунд
а вот такой код не работает и в релизе:
Код

#include <iostream>
using namespace std;

int main()
{
    char *str1, *str2;
    cin >> str1;
    cout << str1 << "\n";
    cin >> str2;
    cout << str2 << "\n";
    return 0;
}

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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Я под Билдером зделал так:
Код


#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
        char *str;
        cin >> str;
        cout << str << endl;
        cin.get();
        cin.get();
        return 0;
}



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

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

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

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

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


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

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


 




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


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

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