C ++从数据文件到某些变量的行读取

时间:2016-04-18 21:22:22

标签: c++ file input

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

这是我到目前为止所做的。

#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 

3 个答案:

答案 0 :(得分:3)

  1. 您的问题是&#34;问:如何解析此文件?&#34;

  2. 答:您已经有了一个良好的开端 - 您希望一次拨打std::getline()一行,直到文件结束。

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

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

  5. 强烈建议:

    • 考虑创建一个Album类。
    • 您的最终结果将是vector<Album>
    • 这个假设的课程可能有一个公共parseLine(string line)方法来阅读每一行,直到专辑完成(&#34; ===&#34;)。
    • 它可能还有私有parseTitle()parseYear()parseTrack()方法,可将输入文本读入正确的类变量。
    • 它可能还有titleyearvector<Track>等公共属性。

答案 1 :(得分:1)

很抱歉,但我不打算为你写作业。

你可以试一下课堂专辑。制作它们的矢量。在专辑类中有一个类轨道的矢量。 专辑类有字段名称和年份。曲目有字段编号和名称。

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

答案 2 :(得分:1)

这不是标准的C ++:

int n = 30;
    int albums[n];

您必须更改为const int n,或者最好使用std::vector<int>。如果n不是const,那么您使用VLA(可变长度数组)扩展名。

至于解析,算法应该如下:

  1. 第一行始终是CD的名称(对吗?)
  2. 然后总是来一年
  3. N次歌曲名称,直到包含&#34; ======&#34;来,如果是这样,那么跳到1.直到文件结束。
  4. 所以在伪代码中:

    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;
    
相关问题