【问题标题】:C++ reading in lines from data file to certain variablesC ++从数据文件中读取行到某些变量
【发布时间】:2016-04-18 21:22:22
【问题描述】:

我必须从数据文件中读取专辑名称、歌曲和专辑年份列表,然后按字母顺序对专辑名称和专辑中的歌曲名称进行排序。我可以读取整个文件,但我无法修改数据文件以了解我通常如何使用数组执行此操作。

这是我目前所拥有的。

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;



int main() {
int n = 30;
    int albums[n];
    string content;

ifstream infile;
infile.open("BeatlesData.txt");
while (getline(infile,content)) {
cout <<content<< endl;

}
infile.close();

这是我试图从中读取的数据文件。每张专辑也用“=”分隔,所以我在阅读时也必须考虑到这一点。

The Beatles White Album 
Year:  1968 
 1. Back in the U.S.S.R.
 2. Dear Prudence
 3. Glass Onion
 4. Ob-La-Di, Ob-La-Da
 5. Wild Honey Pie
 6. The Continuing Story of Bungalow Bill
 7. While My Guitar Gently Weeps
 8. Happiness Is a Warm Gun
 9. Martha My Dear
10. I'm So Tired
11. Blackbird
12. Piggies
13. Rocky Raccoon
14. Don't Pass Me By
15. Why Don't We Do It in the Road?
16. I Will
17. Julia
18. Birthday
19. Yer Blues
20. Mother Nature's Son
21. Everybody's Got Something to Hide Except Me and My Monkey
22. Sexy Sadie
23. Helter Skelter
24. Long, Long, Long
25. Revolution 1
26. Honey Pie
27. Savoy Truffle
28. Cry Baby Cry
29. Revolution 9
30. Good Night 
===============================
Abbey Road 
Year:  1969 
 1. Come Together
 2. Something
 3. Maxwell's Silver Hammer
 4. Oh! Darling
 5. Octopus's Garden
 6. I Want You (She's So Heavy)
 7. Here Comes the Sun
 8. Because
 9. You Never Give Me Your Money
10. Sun King
11. Mean Mr. Mustard
12. Polythene Pam
13. She Came in Through the Bathroom Window
14. Golden Slumbers
15. Carry That Weight
16. The End
17. Her Majesty
===============================
Magical Mystery Tour
Year:  1967 
 1. Magical Mystery Tour
 2. The Fool on the Hill
 3. Flying
 4. Blue Jay Way
 5. Your Mother Should Know
 6. I Am the Walrus
 7. Hello Goodbye
 8. Strawberry Fields Forever
 9. Penny Lane
10. Baby You're a Rich Man
11. All You Need Is Love
=============================== 
Sgt. Pepper's Lonely Hearts Club Band
Year:  1967 
 1. Sgt. Pepper's Lonely Hearts Club Band
 2. With a Little Help from My Friends
 3. Lucy in the Sky With Diamonds
 4. Getting Better
 5. Fixing a Hole
 6. She's Leaving Home
 7. Being for the Benefit of Mr. Kite!
 8. Within You Without You
 9. When I'm Sixty-Four
10. Lovely Rita
11. Good Morning Good Morning
12. Sgt. Pepper's Lonely Hearts Club Band (Reprise)
13. A Day in the Life
=============================== 
Hey Jude
Year:  1970 
 1. Can't Buy Me Love
 2. I Should Have Known Better
 3. Paperback Writer
 4. Rain
 5. Lady Madonna
 6. Revolution
 7. Hey Jude
 8. Old Brown Shoe
 9. Don't Let Me Down
10. The Ballad of John and Yoko 

【问题讨论】:

    标签: c++ file input


    【解决方案1】:
    1. 您的问题是“问:如何解析这个文件?”

    2. 答:你有一个好的开始 - 你想一次调用 std::getline() 一行直到文件结束。

    3. int albums[n]; 是个坏主意。如果你有 49 张专辑会怎样?没有任何?或者,最糟糕的是,51 张专辑?请改用std::vector

    4. “困难的部分”实际上是解析每一行。向我们展示一些工作,我们很乐意就您遇到的具体问题回答具体问题。

    强烈建议:

    • 考虑创建一个Album 类。
    • 您的最终结果将是vector&lt;Album&gt;
    • 这个假设的类可能有一个公共的parseLine(string line) 方法来读取每一行直到专辑完成(“===”)。
    • 它还可能有私有的parseTitle()parseYear()parseTrack() 方法来将输入文本读入适当的类变量。
    • 它也可能具有titleyearvector&lt;Track&gt; 等公共属性。

    【讨论】:

      【解决方案2】:

      对不起,我不会为你写作业。

      你可以试试课堂相册。制作它们的向量。在专辑类里面有一个类音轨的向量。 专辑类具有字段名称和年份。曲目有字段编号和名称。

      前两行读入专辑名称和专辑年份。接下来将以下行读入一个字符串,如果它不以'='开头,则将其解析为轨道号和名称。如果找到等号,则开始读取专辑名称和年份,除非文件结尾。

      【讨论】:

        【解决方案3】:

        这不是标准的 C++:

        int n = 30;
            int albums[n];
        

        您必须更改为const int n,或者最好使用std::vector&lt;int&gt;。如果n 不是const 则使用VLA(可变长度数组)扩展。

        解析,算法应该如下:

        1. 第一行始终是 CD 的名称(对吗?)
        2. 然后总是一年
        3. N 次歌曲名称,直到出现包含“======”的行,如果是,则跳转到 1。直到文件结尾。

        所以在伪代码中:

        struct record_type {
           std::string name;
           std::string year;
           std::vector<std::string name> songs;
        }
        int main() {
        // ...
        std::vector<record_type> discs;
        std::string content;
        while(getline(infile,content)) {
            record_type rec;
            rec.name = content;
            if (!getline(infile,content))
              break;
            rec.year = content;
            while (getline(infile,content)) {
              if ( content.find("=====")!=std::string::npos) break;
              rec.songs.push_back(content);
            }
            discs.push_back(rec);
        };
        }
        

        我不会深入解析每一行,但这是你可以用std::stringstream 做的事情。例如解析年份:

        std::stringstream str("Year:  1968 ");
        int year;
        std::string tmp;
        str >> tmp >> year;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 2020-08-01
          • 1970-01-01
          • 2017-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多