Чтение из текстового файла и вставка данных в массив - PullRequest
0 голосов
/ 28 февраля 2012

Большая часть информации, которую я нашел, основана на числах, однако я хочу использовать слова.Например, если мой текстовый файл выглядит следующим образом:

M
Gordon
Freeman
Engineer
F
Sally
Reynolds
Scientist

Я хочу иметь возможность поместить каждую строку в массив и вывести ее так:

Gender: M
First Name: Gordon
Last Name: Freeman
Job: Engineer
Gender: F
First Name: Sally
Last Name: Reynolds
Job: Scientist

Этот список можетпродолжай и продолжай, но сейчас два хороши.

В настоящее время я использую структуру для хранения информации:

struct PeopleInfo
{
    char gender; 
    char name_first [ CHAR_ARRAY_SIZE ];
    char name_last [ CHAR_ARRAY_SIZE ];
    char job [ CHAR_ARRAY_SIZE ];
};

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

Ответы [ 5 ]

3 голосов
/ 28 февраля 2012

Я думаю, что @ user1200129 находится на правильном пути, но пока не совсем собрал все кусочки вместе.

Я бы немного изменил структуру:

struct PeopleInfo
{
    char gender; 
    std::string name_first;
    std::string name_last;
    std::string job;
};

Тогда я бы перегрузил operator>> для этой структуры:

std::istream &operator>>(std::istream &is, PeopleInfo &p) { 
    is >> p.gender;   
    std::getline(is, p.name_first);
    std::getline(is, p.name_last);
    std::getline(is, p.job);
    return is;
}

Поскольку вы хотите иметь возможность их отображать, я бы добавил operator<<, чтобы сделать это тоже:

std::ostream &operator<<(std::ostream &os, PeopleInfo const &p) { 
    return os << "Gender: " << p.gender << "\n"
              << "First Name: " << p.name_first << "\n"
              << "Last Name: " << p.name_last << "\n"
              << "Job: " << p.job;
}

Тогда чтение в файл, полный данных, может выглядеть примерно так:

std::ifstream input("my file name");

std::vector<PeopleInfo> people;

std::vector<PeopleInfo> p((std::istream_iterator<PeopleInfo>(input)),
                          std::istream_iterator<PeopleInfo(),
                          std::back_inserter(people));

Аналогично, отображение информации о людях из вектора выглядит примерно так:

std::copy(people.begin(), people.end(),
          std::ostream_iterator<PeopleInfo>(std::cout, "\n"));
1 голос
/ 28 февраля 2012

Структура может быть лучше, чем массив для хранения информации.

struct person
{
    std::string gender;
    std::string first_name;
    std::string last_name;
    std::string position;
};

Тогда вы могли бы иметь вектор лиц и повторять его.

0 голосов
/ 28 февраля 2012

Вы также можете использовать файл std :: ifstream как любой другой поток:

//your headers
int main(int argc, char** argv)
{
    std::ifstream file("name.txt");
    std::string line;
    std::vector<std::string> v; // You may use array as well

    while ( file.eof() == false ) {
        file >> line;
        v.push_back( line );
    }

    //Rest of your code
    return 0;
}
0 голосов
/ 28 февраля 2012

Вы также можете использовать такие флаги, как bool maleFlag и bool femaleFlag, и устанавливать для них значение true и false, когда вы читаете только «M» или «F» в строке, чтобы вы знали, какой пол ассоциировать с именами. что следует.

0 голосов
/ 28 февраля 2012

Хорошо, чтобы начать:

// Include proper headers here
int main()
{
    std::ifstream file("nameoftextfilehere.txt");
    std::string line;
    std::vector<std::string> v; // Instead of plain array use a vector

    while (std::getline(file, line))
    {
        // Process each line here and add to vector
    }

    // Print out vector here
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...