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


Автор: Killer_13 13.10.2010, 14:26
Можно например записывать в структуру из файла как-то попроще? Я имею введу в цыкле или как то по другому.
Мне не нравиться код. Насколько смотрел, то доступ к элементам структуры осуществляется через имя, а через идентификатор нельзя?
Нпример вот так
liste[i]

Код

void Anmeld(void){

    struct Anmeldung liste;

    ifstream csv("anmeldung.csv");

    getline(csv,liste.Nachname,'\n');
    getline(csv,liste.Vorname,'\n');
    getline(csv,liste.Email,'\n');
    getline(csv,liste.Matrikelnummer,'\n');
    getline(csv,liste.Studienrichtung,'\n');
    getline(csv,liste.Semester,'\n');
    getline(csv,liste.G1name,'\n');
    getline(csv,liste.G1vorname,'\n');
    getline(csv,liste.Anmerkung,'\n');
}


Пасиб.

Автор: Sartorius 13.10.2010, 14:33
 Если все поля строки, можешь сделать анонимный union из своей структуры и массива строк

Автор: Killer_13 13.10.2010, 14:34
понятненько, так и думал, что попроще не будет. smile

Автор: azesmcar 13.10.2010, 15:43
Цитата(Killer_13 @  13.10.2010,  14:26 Найти цитируемый пост)
Нпример вот так
liste[i]

ну конечно же можно smile 
Код

#include <iostream>
#include <string>
#include <functional>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/iteration.hpp>
#include <boost/fusion/include/at_c.hpp>

struct Anmeldung
{
    enum
    {
        Nachname,
        Vorname,
        Email,
        Matrikelnummer,
        Studienrichtung,
        Semester,
        G1name,
        G1vorname,
        Anmerkung
    };
    typedef boost::fusion::vector<
        std::string, std::string,
        std::string, std::string,
        std::string, std::string,
        std::string, std::string,
        std::string> type;
};

struct input
{
    template <typename T>
    void operator()(T& r) const
    {
        std::cin >> r;
    }
    void operator()(std::string& r) const
    {
        std::getline(std::cin, r);
    }
};

int main()
{
    Anmeldung::type x;
    boost::fusion::for_each(x, input());
    std::cout << boost::fusion::at_c<Anmeldung::Email>(x) << std::endl;
}


Автор: mes 13.10.2010, 15:44
Цитата(Killer_13 @  13.10.2010,  13:34 Найти цитируемый пост)
понятненько, так и думал, что попроще не будет

http://cplusplus.com/reference/iostream/istream/operator%3E%3E/

Автор: Killer_13 13.10.2010, 15:52
Цитата(azesmcar @ 13.10.2010,  15:43)
Цитата(Killer_13 @  13.10.2010,  14:26 Найти цитируемый пост)
Нпример вот так
liste[i]

ну конечно же можно smile 
Код

#include <iostream>
#include <string>
#include <functional>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm/iteration.hpp>
#include <boost/fusion/include/at_c.hpp>

struct Anmeldung
{
    enum
    {
        Nachname,
        Vorname,
        Email,
        Matrikelnummer,
        Studienrichtung,
        Semester,
        G1name,
        G1vorname,
        Anmerkung
    };
    typedef boost::fusion::vector<
        std::string, std::string,
        std::string, std::string,
        std::string, std::string,
        std::string, std::string,
        std::string> type;
};

struct input
{
    template <typename T>
    void operator()(T& r) const
    {
        std::cin >> r;
    }
    void operator()(std::string& r) const
    {
        std::getline(std::cin, r);
    }
};

int main()
{
    Anmeldung::type x;
    boost::fusion::for_each(x, input());
    std::cout << boost::fusion::at_c<Anmeldung::Email>(x) << std::endl;
}


azesmcar
Дяяяя, я не такой крутой кодер. smile

mes

А подскажите пож, а кукую информацию я должен взять из вашей ссылки на счет структур.

Всем спасибо. smile

Автор: mes 13.10.2010, 17:05
Цитата(Killer_13 @  13.10.2010,  14:52 Найти цитируемый пост)
а кукую информацию я должен взять из вашей ссылки на счет структур.

о том, как удобно использовать оператор >> 
smile
Код

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

struct Anmeldung
{
  std::string Nachname;
  std::string Vorname;
  std::string Email;
};

std::istream& operator >> (std::istream& is, Anmeldung& a)
{
    is >> a.Nachname
       >> a.Vorname
       >> a.Email;
    
    return is;
}
int main () {

     std::ifstream csv("anmeldung.csv");
     
     Anmeldung a;
     
     csv >> a;
}



Автор: Killer_13 13.10.2010, 19:40
Пасиб

Автор: SVN74 13.10.2010, 20:31
Вот более примитивный примерчик:
Код

//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

struct My
{
    char MyName[30];
    char SheName[25];
    char HeName[60];
    int Num;
};
int main(int argc, char* argv[])
{
    My  m, m2;
        strcpy(m.MyName, "My Name is");
        strcpy(m.SheName, "She Name is");
        strcpy(m.HeName, "He Name is");
        m.Num = 12345;

   HANDLE    MyF = CreateFile("C:\\MyProba.dat",
                             GENERIC_WRITE | GENERIC_READ,
                             NULL,
                             0,
                             OPEN_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);
    if(MyF != INVALID_HANDLE_VALUE)
    {
        DWORD T;
        WriteFile(MyF, &m, sizeof(My), &T, NULL);
            SetFilePointer(MyF, 0, NULL, FILE_BEGIN);
        ReadFile(MyF, &m2, sizeof(My), &T, NULL);
        CloseHandle(MyF);

        printf(" 1 = %s\n 2 = %s\n 3 = %s\n 4 = %d\n",
                m2.MyName, m2.SheName, m2.HeName, m2.Num);
    }
    getchar();
    return 0;
}
//---------------------------------------------------------------------------

Автор: djamshud 13.10.2010, 20:48
Код

   HANDLE    MyF = CreateFile("C:\\MyProba.dat",
                             GENERIC_WRITE | GENERIC_READ,
                             NULL,
                             0,
                             OPEN_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);


Ну и зачем такое извращение в юзерспейсе?

Топикстартеру советую почитать что-нибудь про (де)сериализацию данных.

Автор: Killer_13 13.10.2010, 20:51
Грспода, я же в самом начале говорил, что мне нужно только задачку решить, мне не нужно очень глубоко в с++ лезть. smile

Автор: Sartorius 13.10.2010, 21:41
 smile 
Цитата(djamshud @  13.10.2010,  21:48 Найти цитируемый пост)
Ну и зачем такое извращение в юзерспейсе?

А причем здесь userspace? Насколько я знаю, в ring0 совсем другие функции для работы с ФС используются. Я, кстати, в последнее время тоже стараюсь реже использовать обретки из stdio...

Автор: djamshud 13.10.2010, 23:44
Оффтопик, так оффтопик.

Я могу понять использование этой десятиэтажной каракатицы в драйвере. Могу понять, если нужно как-то изощренно открыть файл (судя по всему те стопицот передаваемых параметров именно изощренности и служат) или чтобы получить идентификатор для дальнейших изощрений. Я могу понять, почему не пользоваться плюсовыми стримами. Но я не могу понять, зачем такой абракадаброй просто, черт возьми, сбрасывать данные в файл.

Право, я не в курсе, можно ли использовать это в драйвере, или для тех случаев существуют другие каракатицы. Я просто имел в виду решение прикладной задачи - не так выразился.

Автор: Dov 14.10.2010, 09:33
Цитата(Killer_13 @  13.10.2010,  13:26 Найти цитируемый пост)
Можно например записывать в структуру из файла как-то попроще?


fread

Автор: SVN74 14.10.2010, 20:06
Цитата(djamshud @  13.10.2010,  23:44 Найти цитируемый пост)
Я могу понять использование этой десятиэтажной каракатицы в драйвере. Могу понять, если нужно как-то изощренно открыть файл (судя по всему те стопицот передаваемых параметров именно изощренности и служат) или чтобы получить идентификатор для дальнейших изощрений. Я могу понять, почему не пользоваться плюсовыми стримами. Но я не могу понять, зачем такой абракадаброй просто, черт возьми, сбрасывать данные в файл.

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

Автор: bsa 14.10.2010, 21:06
Цитата(SVN74 @  14.10.2010,  21:06 Найти цитируемый пост)
Для Windows приложений рекомендуется использовать CreateFile, по причине более безопасных доступов к файловой системе. 
И что это значит? Тебе это часто нужно? Ты считаешь, что прикладная пользовательская программа обязательно должна так открывать файлы, чтобы другие не могли их даже читать? Бред.

Автор: xvr 15.10.2010, 08:57
Цитата(SVN74 @ 14.10.2010,  20:06)
Для Windows приложений рекомендуется использовать CreateFile, по причине более безопасных доступов к файловой системе.

Можно подумать, что fopen не использует CreateFile, а напрямую потрошит диски?  smile Или вы считаете, что сможете использовать CreateFile более безопасным способом, чем разработчики CRT в компиляторах?

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