繁体   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