Напішыце функцыю для чытання і нумар сумы з файла C ++

Такім чынам, файл выглядае так:

tucanos 10
tacobell 5
tucanos 5
pizzahut 15
tucanos 5
pizzahut 2
tucanos 5

Калі радок імя рэстарана і нумар лік падобных ён мае. Я павінен даведацца суму шэрагу падобных для кожнага рэстарана ад чытання файла, але я паняцця не маю, як гэта зрабіць. Хто-небудзь з вас ёсць нейкія намёкі на мяне?

0
дзе Google? так як вы пайшлі туды і надрукаваў гэта я мяркую, чаму вы не проста паставіць вынік тут? аааа, каб зрабіць рэчы больш цяжкім, добра бачу
дададзена аўтар 4pie0, крыніца
дзе Google? так як вы пайшлі туды і надрукаваў гэта я мяркую, чаму вы не проста паставіць вынік тут? аааа, каб зрабіць рэчы больш цяжкім, добра бачу
дададзена аўтар 4pie0, крыніца
Перайсці да Google і набярыце «C ++ файл ўводу-высновы».
дададзена аўтар Luchian Grigore, крыніца

8 адказы

першае, тут добрая функцыя для падзелу станд :: радок у станд :: вектар дадзена Падзельнік характар:

std::vector &split(const std::string &s, 
    char delim, std::vector &elems) {
        std::stringstream ss(s);
        std::string item;
        while (std::getline(ss, item, delim)) {
            elems.push_back(item);
        }
        return elems;
}

побач, мы можам дасягнуць жаданага выніку з дапамогай гэтага кода:

int main(int argc, char** argv) {

    std::map map;
    std::ifstream file("file_with_string.txt", std::ifstream::in);
    std::string temp;
    while (std::getline(file, temp)) {
        std::cout << temp << "\n";
        std::vector tokens;
        tokens = split(temp, ' ', tokens);

        for (std::vector::iterator it = tokens.begin(); 
             it != tokens.end(); it++) {
            std::vector::iterator it1 = it;
            std::map::iterator mapIt = map.find(*it++);
            int number;
            std::istringstream(*it) >> number;
            if (mapIt != map.end()) {
                (mapIt->second) += (number);
            } else {
                map[*it1] = number;
            }

        }
    }

    for (std::map::iterator it = map.begin(); 
         it != map.end(); it++) {
        std::cout << it->first << " " << it->second << "\n";
    }
    return 0;
}

Tucanos 10 tacobell 5 Tucanos 5 pizzahut 15 Tucanos 5 pizzahut 2 Tucanos 5

pizzahut 17

tacobell 5

Tucanos 25

RUN больш паспяхова (агульны час: 55ms)


мы можам зрабіць яго прасцей

    std::map map;
    std::ifstream infile("file_with_string.txt",std::ifstream::in);

    std::string resturant = "";
    int likes = 0;

    while(infile >> resturant >> likes ){
            map[resturant ] += likes ;
    }

але першая версія дае больш глыбокае ўяўленне ИМО ў итераторы, як прайсці станд :: Карта , станд :: вектар і як засяліцца карту.

0
дададзена
Так. адзіная ўмова ёсць ўмоўнасць захоўваецца: Значэнне імя
дададзена аўтар 4pie0, крыніца
Дзякуючы. Але, падобна, код можна выкарыстоўваць толькі, калі мы ведаем, што ў тэксце? Выбачайце, але я пачатковец у C ++. Ці ёсць код па-ранейшаму працуе нармальна, калі тэкст невядомы? Як і ў вы не ведаеце, колькі радкоў ёсць, колькі рэстаранаў ёсць, і г.д ..
дададзена аўтар Ken Yoo Ho, крыніца

Вось некаторыя псевдокод:

Open file
For each restaurant-likes pair
    Read restaurant-likes pair from file
    If first time we've seen a restaurant
        Add restaurant to list
    Lookup restaurant in list and add likes to total for that restaurant
End For
Close file

Print all restarants and total likes
0
дададзена
Вядома. <�Код> станд :: вектар , напрыклад.
дададзена аўтар John, крыніца
прабачце за пытанне яшчэ дурны пытанне. Я маю на ўвазе з дапамогай функцыі пошуку, каб знайсці пару-рэстаран любіць, але гэта, здаецца, не працуе, таму што я не ведаю, колькі радкоў ёсць у тэксце. Ці ёсць спосаб для мяне, каб выкарыстоўваць вектары, каб для адвольнага ліку рэстарана? Вялікі дзякуй
дададзена аўтар Ken Yoo Ho, крыніца

Вось некаторыя псевдокод:

Open file
For each restaurant-likes pair
    Read restaurant-likes pair from file
    If first time we've seen a restaurant
        Add restaurant to list
    Lookup restaurant in list and add likes to total for that restaurant
End For
Close file

Print all restarants and total likes
0
дададзена
Вядома. <�Код> станд :: вектар , напрыклад.
дададзена аўтар John, крыніца
прабачце за пытанне яшчэ дурны пытанне. Я маю на ўвазе з дапамогай функцыі пошуку, каб знайсці пару-рэстаран любіць, але гэта, здаецца, не працуе, таму што я не ведаю, колькі радкоў ёсць у тэксце. Ці ёсць спосаб для мяне, каб выкарыстоўваць вектары, каб для адвольнага ліку рэстарана? Вялікі дзякуй
дададзена аўтар Ken Yoo Ho, крыніца
// c:\temp\nameofexecutable.exe < yourtextfile.txt

#include 
#include 
#include  #include  using namespace std; int main() { string resturant; int likes; map likesCount; while (cin >> resturant >> likes) { likesCount[resturant] += likes; } for_each(begin(likesCount), end(likesCount), [&](pair x){ cout << x.first << " " << x.second << endl; }); //// using plain for instead of std::for_each //for (auto i = begin(likesCount); i != end(likesCount); i++) { // cout << i->first << " " << i->second << endl; //} } 
0
дададзена
for_each ў <�алгарытм> загаловак ... які кампілятар/IDE вы карыстаецеся?
дададзена аўтар salek, крыніца
бачыў абнаўленне? замест for_each/лямбда вы можаце выкарыстоўваць для цыклу, а таксама (біт, які закаментаваўшы)
дададзена аўтар salek, крыніца
for_each не вызначаны. Як я магу выправіць гэта?
дададзена аўтар Ken Yoo Ho, крыніца
// c:\temp\nameofexecutable.exe < yourtextfile.txt

#include 
#include 
#include  #include  using namespace std; int main() { string resturant; int likes; map likesCount; while (cin >> resturant >> likes) { likesCount[resturant] += likes; } for_each(begin(likesCount), end(likesCount), [&](pair x){ cout << x.first << " " << x.second << endl; }); //// using plain for instead of std::for_each //for (auto i = begin(likesCount); i != end(likesCount); i++) { // cout << i->first << " " << i->second << endl; //} } 
0
дададзена
for_each ў <�алгарытм> загаловак ... які кампілятар/IDE вы карыстаецеся?
дададзена аўтар salek, крыніца
бачыў абнаўленне? замест for_each/лямбда вы можаце выкарыстоўваць для цыклу, а таксама (біт, які закаментаваўшы)
дададзена аўтар salek, крыніца
for_each не вызначаны. Як я магу выправіць гэта?
дададзена аўтар Ken Yoo Ho, крыніца

Use fscanf to parse the input from file and then apply the add operation. Example

0
дададзена

Use fscanf to parse the input from file and then apply the add operation. Example

0
дададзена

можа быць, можа дапамагчы вам:

#include 
#include 
#include  #include  #include  int main() { std::map count; std::ifstream infile("cars.dat", std::ios::in); if (infile == NULL) { fprintf(stderr, "Failed to open file.\n"); exit(-1); } std::string resturant = ""; int likes = 0; while(infile >> resturant >> likes ){ count[resturant ] += likes ; } printf("--------------------each sum-------------------\n"); std::map::iterator it(count.begin()); for (; it != sum.end(); ) { printf("%s %d\n", (it->first).c_str(),it->second); it++; } infile.close(); return 0; } 

Вынік: -------------------- кожная сума ------------------- pizzahut 17 tacobell 5 Tucanos 25

0
дададзена
Дзякуючы. Але, падобна, код можна выкарыстоўваць толькі, калі мы ведаем, што ў тэксце? Выбачайце, але я пачатковец у C ++. Ці ёсць код па-ранейшаму працуе нармальна, калі тэкст невядомы? Як і ў вы не ведаеце, колькі радкоў ёсць, колькі рэстаранаў ёсць, і г.д ..
дададзена аўтар Ken Yoo Ho, крыніца