繁体   English   中英

用字符串和整数逐行读取文件

[英]Reading a file line by line with strings and integers

我正在尝试从以下文件中读取信息:

The Firm
Dell
512
Fundamentals of Computer Graphics
A K Peters, Ltd.
662
The C++ Programming Language
Addison-Wesley Professional
911
Northwest Airlines
Plymouth Toy & Book
96
Lonely Planet: Europe on a Shoestring
Lonely Planet Publications
1324
…

该文件列出了书籍,第一行是书名,第二行是出版商,第三行是页数,重复五本书。 我正在尝试读取信息,并将其存储到Library类中的向量中。

class book

{


public:

    book();


    book(string t, string p, int num);


    string getTitle();
    string getPublisher();
    int getPageNum();


    void setTitle(string t);
    void setPublisher(string p);
    void setPageNum(int num);


    string title;
    string publisher;
    int num_of_pages;

};



  class library
    {
    public:
        vector<book> collection;

        bool contains(string title);

        void addBook(book b);

        void readFile(string fileName);
    }

这是readFile函数:

   void library::readFile(string fileName)
    {
        ifstream infile;
        infile.open(fileName.c_str());
        if (infile.fail())
        {
            cout<<"Error opening file."<<endl<<endl;
            exit(1);
        }

       book addition;
string line;

while (!infile.eof())
{
    getline(infile, addition.title);
    getline(infile, addition.publisher);
    getline(infile, line);
    addition.num_of_pages=atoi(line.c_str());
    collection.push_back(addition);  
}


        collection.push_back(addition);


    }

最后一个问题:输出无法正常工作。 文件中的所有内容均列在标题下。

ostream &operator <<(ostream& out, const book& b1)
{
    out<<"TITLE: "<<b1.title<<endl;
    out<<"PUBLISHER: "<<b1.publisher<<endl;
    out<<"NUMBER OF PAGES: "<<b1.num_of_pages<<endl;

    return out;
}

主要代码:

int i;
                for (i=0; i<book_library.collection.size(); i++)
                {
                    cout<<book_library.collection[i]<<endl;
                }

输出:

TITLE: The Firm
Dell
512
Fundamentals of Computer Graphics
A K Peters, Ltd.
662
The C++ Programming Language
Addison-Wesley Professional
911
Northwest Airlines
Plymouth Toy & Book
96
Lonely Planet: Europe on a Shoestring
Lonely Planet Publications
1324
\311
PUBLISHER: 
NUMBER OF PAGES: 0

一种简化可能是,因为getline返回一个istream ,以便在while条件下直接对其进行测试:

while (getline(infile, addition.title)) {
    getline(infile, addition.publisher);
    getline(infile, line);
    addition.num_of_pages = atoi(line.c_str()); // string -> int
    collection.push_back(addition);  // you should push_back in the while loop
}

您可以为您的book类定义一个提取运算符以将内容封装起来,也可以使用标准的内置提取运算符(>>)来保存临时变量和转换:

std::ifstream & operator>>(std::ifstream & str, book & b)
{
    str >> b.title >> b.publisher >> b.num_of_pages;
    return str;
}

std::ifstream infile;
book addition;
std::vector<book> collection;
while ( infile >> addition)
{
    collection.push_back(addition);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM