Модераторы: 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   Вверх
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   Вверх
likehood
Дата 11.12.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



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


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


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

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



чудеса какие-то. В Борланде все пашет. Завтра на VS на работе посмотрю.
Код

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

}

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


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



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


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


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

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



Вот откомпиленный пример

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  str.ex 94,00 Kb
PM MAIL   Вверх
bsa
Дата 11.12.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Мда, очень повезло...  smile 
PM   Вверх
mrbrooks
Дата 11.12.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



да уж я счасливчик  smile . но раз уж два ... пардон три!!! да каких комрада настаивают на одной вещи - значит истина на их стороне. буду знать. спаСибо.

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


Эксперт
****


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

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



mrbrooks, да зачем нам твои примеры? Изначально понятно, что этот код ОШИБОЧНЫЙ. И если у тебя в билдере почему-то работает, это не значит что он вообще работает. Попробуй при определении присвоить str=0 и str1=0. И посмотри, что будет.
PM   Вверх
mrbrooks
Дата 12.12.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



я уже спать хочу  smile завтра буду мутить и шаманить. Все. Больше так делать не буду и никому советовать тоже smile Я же тоже учусь
Цитата

mrbrooks, да зачем нам твои примеры? Изначально понятно, что этот код ОШИБОЧНЫЙ. И если у тебя в билдере почему-то работает, это не значит что он вообще работает. Попробуй при определении присвоить str=0 и str1=0. И посмотри, что будет.


зделал. билдер послал меня в задницу - если ни куда подальше smile

Добавлено через 8 минут и 50 секунд
а вот если str1 = "0"  и str2 = "0" - то все зашибись

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


Шустрый
*


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

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



Сам разобрался. Может вы и пытались мне помочь, но я   не услышал того, что мне надо было.
Ошибка была в воде с клавиатуры.
Вот правильный вариант:
Код

cout << Rus("ФИО ");
cin.get();
cin.get(z[i].fio,21);


Написать то я написал только не совсем понял - мне пока не понятно еще как это у меня       работает. Сам не понял как написал.

Если убрать cin.get(); то результаты плачебные в файле.
Объясните мне что дает cin.get(); , т.е. как она работает и для чего предназначена (пустая ф-ция).
Мне не понятно почему вместе
cin.get();
cin.get(z[i].fio,21);
только получается нужный вариант.

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


Эксперт
****


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

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



Slyfox, а документацию почитать?

попробуй так:
Код
cout << Rus("ФИО: ") << flush;
cin.getline(z[i].fio, 21);

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

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

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

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

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


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

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


 




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


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

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