читать в значениях и хранить в списке в C ++ - PullRequest
0 голосов
/ 27 августа 2011

У меня есть текстовый файл с данными, подобными следующим:

name
weight 
groupcode

name
weight
groupcode

name
weight
groupcode

теперь я хочу записать данные всех людей в выходной файл до достижения максимального веса 10000 кг

В настоящее время у меня есть это:

 void loadData(){
            ifstream readFile( "inFile.txt" );
            if( !readFile.is_open() )
        {
            cout << "Cannot open file" << endl;
        }
            else
            {
                    cout << "Open file" << endl;
            }

            char row[30]; // max length of a value
            while(readFile.getline (row, 50))
            {
                    cout << row << endl;
                    // how can i store the data into a list and also calculating the total weight?
            }
            readFile.close();
    }

Я работаю с Visual Studio 2010 Professional!

потому что я новичок в c ++, возможно, это лучший способ! я открыт для любых идей и предложений

спасибо заранее!

Ответы [ 4 ]

2 голосов
/ 27 августа 2011

Ну, вот подсказка. Видите ли вы несоответствие между вашим кодом и описанием проблемы? В описании проблемы у вас есть данные в группах четыре строки, имя, вес, код группы и пустая строка. Но в вашем коде вы читаете только одну строку каждый раз вокруг цикла, вы должны читать четыре строки каждый раз вокруг цикла. Так что-то вроде этого

char name[30];
char weight[30];
char groupcode[30];
char blank[30];
while (readFile.getline (name, 30) && 
    readFile.getline (weight, 30) && 
    readFile.getline (groupcode, 30) && 
    readFile.getline (blank, 30)) 
{
    // now do something with name, weight and groupcode
}

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

2 голосов
/ 27 августа 2011
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <limits>

struct entry
{
    entry()
        : weight()
    { }

    std::string name;
    int weight; // kg
    std::string group_code;
};

// content of data.txt
// (without leading space)
//
// John
// 80
// Wrestler
// 
// Joe
// 75
// Cowboy


int main()
{
    std::ifstream stream("data.txt");
    if (stream)
    {
        std::vector<entry> entries;

        const int limit_total_weight = 10000;   // kg
        int total_weight = 0;                   // kg

        entry current;
        while (std::getline(stream, current.name) &&
               stream >> current.weight &&
               stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n') &&  // skip the rest of the line containing the weight
               std::getline(stream, current.group_code))
        {
            entries.push_back(current);

            total_weight += current.weight;
            if (total_weight > limit_total_weight)
            {
                break;
            }

            // ignore empty line
            stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }
    else
    {
        std::cerr << "could not open the file" << std::endl;
    }
}

Редактировать: Поскольку вы хотите записать записи в файл, просто выведите записи, а не сохраняйте их в векторе.И, конечно, вы можете перегрузить оператор >> и оператор << для типа записи. </p>

0 голосов
/ 27 августа 2011

Если вы хотите что-то сделать, чтобы создать работающую программу самостоятельно, прочитайте это.Если вы предпочитаете учиться на собственном примере и изучать сильный пример ввода / вывода на C ++, я бы определенно предложил рассмотреть код Саймона.

Перво-наперво: вы создали буфер строк с 30 символами, когда писал, "символ строки [30];"В следующей строке вы должны изменить вызов readFile.getline (row, 50) на readFile.getline (row, 30).В противном случае он попытается прочитать 50 символов, и если кто-то имеет имя длиннее 30, память после буфера будет повреждена.Итак, это нет-нет.;)

Если вы хотите изучать C ++, я настоятельно рекомендую вам использовать стандартную библиотеку для ввода-вывода, а не специальные библиотеки Microsoft, которые предлагает rplusg.Вы на правильном пути с ifstream и getline.Если вы хотите изучать чистый C ++, у Саймона есть правильная идея о том, чтобы отключить массив символов для std :: string.

В любом случае, Джон дал хороший совет по структурированию вашей программы вокруг описания проблемы.По его словам, вы захотите читать четыре строки с каждой итерацией цикла.Когда вы читаете весовую линию, вы захотите найти способ получить числовой вывод из нее (если вы придерживаетесь массива символов, попробуйте http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/, или http://www.cplusplus.com/reference/clibrary/cstdlib/atof/ для не-целыхномера).Затем вы можете добавить это к общему весу.Каждая итерация выводит данные в файл по мере необходимости, и как только ваш общий вес> = 10000, вот когда вы знаете, что нужно выйти из цикла.

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

Вместо этого вы также можете структурировать цикл как while (total <= 10000) или что-то подобное.В этом случае вы можете использовать четыре набора if (readFile.getline (row, 30)) внутри цикла, и вы сможете читать вес и распечатывать вещи между каждым набором.Цикл завершится автоматически после итерации, которая увеличивает общий вес более 10000 ... но вы также должны выйти из нее, если достигнете конца файла, или вы застрянете в цикле на всю вечность.: p </p>

Удачи!

0 голосов
/ 27 августа 2011

Имеют два файловых указателя, попробуйте прочитать входной файл и продолжайте запись в файл o / p. Между тем есть счетчик и продолжать увеличиваться с весом. Когда вес> = 10k, разорвать петлю. К тому времени у вас будут необходимые данные в файле o / p.

Используйте эту ссылку для списка API ввода-вывода: http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx

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