簡體   English   中英

從用分號分隔的文件中讀取並存儲到數組中

[英]Reading from file separated with semicolons and storing into array

我完全迷失了,已經嘗試了幾個小時從一個名為“ movies.txt”的文件中讀取信息,並將其信息存儲到數組中,因為它具有分號。 有什么幫助嗎? 謝謝。

movies.txt:

The Avengers     ; 2012     ;  89    ;   623357910.79
Guardians of the Galaxy    ;   2014    ;  96    ; 333130696.46

碼:

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

struct Movie {
    std::string name;
    int year;
    int rating;
    double earnings;
};

int main()
{
    const int MAX_SIZE = 100;
    Movie movieList[MAX_SIZE];
    std::string line;
    int i = 0;

    std::ifstream movieFile;
    movieFile.open("movies.txt");

    while (getline(movieFile, line, ';'))
    {
        movieFile >> movieList[i].name >> movieList[i].year >> movieList[i].rating >> movieList[i].earnings;
        i++;
    }

    movieFile.close();

    std::cout << movieList[0].name << " " << movieList[0].year << " " << movieList[0].rating << " " << movieList[0].earnings << std::endl;
    std::cout << movieList[1].name << " " << movieList[1].year << " " << movieList[1].rating << " " << movieList[1].earnings << std::endl;

    return 0;
}

我想要的是:

movieList[0].name = "The Avengers";
movieList[0].year = 2012;
movieList[0].rating = 89;
movieList[0].earnings = 623357910.79;

movieList[1].name = "Guardians of the Galaxy";
movieList[1].year = 2014;
movieList[1].rating = 96;
movieList[1].earnings = 333130696.46;

我修改了您的代碼。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>

struct Movie {
    std::string name;
    int year;
    int rating;
    double earnings;
};


std::vector<std::string>
split(const std::string &s, char delim = ',')
{

    std::vector<std::string> elems;

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


int main()
{

    std::vector<Movie> movieList;
    std::string line;


    std::ifstream movieFile;
    movieFile.open("movies.txt");

    while (getline(movieFile, line))
    {
        std::vector<std::string> columns = split(line,';');
        Movie movie;

        movie.name     = columns[0];
        movie.year     = std::stoi(columns[1]);
        movie.rating   = std::stoi(columns[2]);
        movie.earnings = std::stof(columns[3]);

        movieList.push_back(movie);
    }

    movieFile.close();

    for (const Movie & m: movieList) 
    {
        std::cout << m.name << " " << m.year << " " << m.rating << " " << m.earnings << std::endl;
    }


    return 0;
}

基本上,我添加了一個split函數,該函數使用';'分隔行。 另外,我使用矢量來存儲電影,而不是硬編碼的電影數組。 這樣好多了。

PS第二版,不含向量

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>

struct Movie {
    std::string name;
    int year;
    int rating;
    double earnings;
};



void split(const std::string &s, char delim, std::string elems[])
{
    std::stringstream ss(s);
    std::string item;

    int i = 0;

    while (std::getline(ss, item, delim))
    {
            elems[i++] = item;
    }
}


int main()
{

    //std::vector<Movie> movieList;

    const int MAX_SIZE = 100;
    Movie movieList[MAX_SIZE];
    int movieNo = 0;

    std::string line;


    std::ifstream movieFile;
    movieFile.open("/home/marcin/testing/movies.txt");

    std::string columns[4];

    while (getline(movieFile, line))
    {
        split(line,';', columns);

        movieList[movieNo].name     = columns[0];
        movieList[movieNo].year     = std::stoi(columns[1]);
        movieList[movieNo].rating   = std::stoi(columns[2]);
        movieList[movieNo].earnings = std::stof(columns[3]);

        ++movieNo;

    }

    movieFile.close();

    for (int i =0; i < movieNo; ++i) {
        std::cout << movieList[i].name
                  << " "
                  << movieList[i].year
                  << " "
                  << movieList[i].rating
                  << " "
                  << movieList[i].earnings
                  << std::endl;
    }


    return 0;
}

使用getline(my_movieFile, movie_name, ';')可以獲取電影的名稱,直到;;。

如果需要,您需要弄清楚如何從名稱中刪除尾隨空格。您可以搜索示例。

使用getline(movieFile, line)讀取其余部分

使用std::replace替換所有; line

line放入std::stringstream

然后使用>>運算符從字符串流中提取其余字段。

將其放入循環中do { ... } while (movieFile);

另外,請勿硬編碼任意數量的電影。 使用std::vector<Movie>push_back添加新的。

我認為您想使用std::strtok類的東西將行划分為令牌。 此處查看參考。 該頁面上給出的示例使用空格作為分隔符,您將使用分號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM