从 txt 文件读入向量然后按数字排序 C++

Posted

技术标签:

【中文标题】从 txt 文件读入向量然后按数字排序 C++【英文标题】:Reading from txt file into vector then sorting numerically C++ 【发布时间】:2014-11-22 21:00:33 【问题描述】:

03 里贝纳 7 2.20

17 咖啡 76 1.50

24 茶 21 1.10

39 精灵 3 1.70

56 可乐 18 1.70

68橙106 2.20

77 石灰 11 2.10

86 葡萄 34 2.30

55 巧克力 15 2.70

16 冰霜 20 2.20

65 柠檬水 21 1.90

55 酸奶 99 3.40

05 冲床 3 1.70

这些记录需要根据它们在第一列的 ITEM NUMBER 进行排序。

void record_initialize()

    vector<string> record;
    cout << "\n";
    record.push_back("03""\t\t""Ribena""\t\t""7""\t\t""2.20");
    record.push_back("17"  "\t\t""Coffee"  "\t\t""76"  "\t\t""1.50");
    record.push_back("24"  "\t\t""Tea"     "\t\t""21"   "\t\t""1.10");
    record.push_back("39"  "\t\t""Sprite"   "\t\t""3" "\t\t""1.70");
    record.push_back("56"   "\t\t""Cola"  "\t\t""18" "\t\t""1.70");
    record.push_back("68"  "\t\t""Orange"  "\t\t""106""\t\t""2.20");
    record.push_back("77"  "\t\t""Lime"    "\t\t""11" "\t\t""2.10");
    record.push_back("86"  "\t\t""Grape"     "\t\t""34" "\t\t""2.30");
    record.push_back("55" "\t\t" "Chocolate"   "\t""15" "\t\t""2.70");
    record.push_back("16"  "\t\t""Frosty"    "\t\t""20" "\t\t""2.20");
    record.push_back("55" "\t\t" "Lemonade"  "\t""21" "\t\t""1.90");
    record.push_back("55"  "\t\t""Yoghurt"   "\t\t""99" "\t\t""3.40");
    record.push_back("05"  "\t\t""Punch"     "\t\t""3"  "\t\t""1.70");
    cout << "\n";
    //sort(record.begin(), record.end());
    ofstream output_file("Drinks.txt");
    ostream_iterator<string> output_iterator(output_file, "\n");
    copy(record.begin(), record.end(), output_iterator);

void record_add()

    DrinkRecord d;
    cout << "\n";
    cout << "Please enter the item no.: ";
    cin >> d.no;
    cout << "\n";
    cout << "Please enter name of drink: ";
    cin >> d.name;
    cout << "\n";
    cout << "Please enter the quantity: ";
    cin >> d.quantity;
    cout << "\n";
    cout << "Please enter the unit price: ";
    cin >> d.price;
    cout << "\n";
    ofstream myfile;
    myfile.open("Drinks.txt", ios::app | ios::out);
    cout << "\n";
    myfile << d.no << "\t\t" << d.name << "\t\t" << d.quantity << "\t\t" << d.price << endl;
    myfile.close();


void record_view()


    cout << "\n";
    cout << "ItemNo" << "\t\t" << "ItemName" << "\t" << "Quantity" << "\t" << "Unit Price" << endl;
    cout << "\n";
    string getcontent;
    ifstream openfile("Drinks.txt");
    if (openfile.is_open())
    
        while (!openfile.eof())
        
            getline(openfile, getcontent);
            cout << getcontent << endl;
        
    

我已经设法完成了那部分。但是,在我将新项目添加到饮料库存后,我现在遇到了排序问题。我的讲师告诉我将txt文件读入向量,然后对向量进行排序,然后显示结果。我似乎无法得到正确的步骤。任何帮助将非常感激。 我尝试过这样的事情。

void read_File() //Read the file into the vector function definition


    vector<string> logs;
    string line;


    cout << "Testing loading of file." << endl;
    ifstream myfile("Drinks.txt");
    if (myfile.is_open())
    
        while (!myfile.eof())
        
            getline(myfile, line);
            logs.push_back(line);
            sort(line.begin(), line.end());

        
        myfile.close();
    
    else
        cout << "Unable to open file." << endl;
    


【问题讨论】:

您没有对向量进行排序。您正在对每一行的字母进行排序。也请不要循环eof():***.com/questions/5605125/… 【参考方案1】:

您似乎在阅读每一行后进行排序。请注意,对sort 的调用在循环内。这意味着在每次迭代中(在您阅读的每一行之后)您都会调用sort。如果我正确理解了您的分配,您需要对文件中的所有行 (logs) 进行排序。如果是这样,那么这意味着您只需要致电sort 一次。您可能需要将 logs 向量作为参数传递给它,而不是将行作为参数传递给它,因为您想要对日志进行排序。

【讨论】:

【参考方案2】:

您必须在阅读整个文件后对其进行一次排序。 还有,sort(line.begin(), line.end());将根据字符串比较规则对向量中的字符串进行排序,但是,您需要根据第一列进行排序。 您需要编写自己的自定义比较器,该比较器从要比较的两个字符串中读取第一列。 由于这看起来像一个类问题,我将让你编写下面的比较器函数。 如需更多帮助,请参阅下面的链接。

sort(line.begin(), line.end(), mycolumncomparator);

// Fill the below function correctly
bool mycolumncomparator(const std::string& i, const std:string& j) 
 
    // Read the first column from both strings
    // covert them into int using atoi
    // return (int1 < int2);

请参考这里:http://www.cplusplus.com/reference/algorithm/sort/

【讨论】:

以上是关于从 txt 文件读入向量然后按数字排序 C++的主要内容,如果未能解决你的问题,请参考以下文章

用c++从txt文件中读入数字的问题

双向链表模板向量中的输入排序(C++)

将文本文件读入二维向量。 C++

关于c++文件流读入和写入的问题

C++ 冒泡排序升序 - 不对所有元素进行排序

作业帮助;从多个文件读入向量/数组