c ++将文件读入结构并编写二进制文件

时间:2016-03-25 17:19:35

标签: c++ text-files fstream binaryfiles objective-c++

我有一个包含超过5000行数据的文本文件(Lotto的抽奖结果)。每行的格式为:number。 day.month.year number1,number2,number3,number4,number5,number6

五个样本行:

  1. 27.01.1957 8,12,31,39,43,45
  2. 03.02.1957 5,10,11,22,25,27
  3. 10.02.1957 18,19,20,26,45,49
  4. 17.02.1957 2,11,14,37,40,45
  5. 24.02.1957 8,10,15,35,39,49
  6. 我也有:

    struct Lotto
    {
        short number_drawing;
        char day;
        char month;
        short year;
        char tab[6];
    };
    

    我必须将此文本文件中的数据写入struct Lotto的二进制文件中。

    我已经没有想法了。 我已经尝试了几天,但我的程序仍然无法正常工作:(

    我尝试加载一行:)

       int main()
    {
        ifstream text("lotto.txt", ios::in); 
        ofstream bin("lottoBin.txt", ios::binary | ios::out);
        Lotto zm;
        short number_drawing;
        char day;
        char month;
        short year;
        char tab[6];
        char ch;
        int records = 0;
        while (!text.eof())
        {
            text >> zm.number_drawing >> ch >> zm.day >> ch >> zm.month >> 
    ch >> zm.year >> zm.tab[0] >> ch >> zm.tab[1] >> ch >> zm.tab[2] >> 
    ch >> zm.tab[3] >> ch >> zm.tab[4] >> ch >> zm.tab[5];
            records++;
        }
        cout << "All records: " << records << endl;
    

1 个答案:

答案 0 :(得分:0)

以下是一些可能对您有所帮助的观察结果:

  • 您将无法直接将某个数字读入char。使用中间整数。

  • 定义一个阅读记录的函数:bool read( std::istream&, Lotto& )

  • 您的while应致电以上函数:while ( read( is, lotto ) )

一个起点:

bool read( std::istream& is, Lotto& lotto )
{
  short t;
  char c;

  // read data

  //
  is >> t;
  lotto.number_drawing = t;
  is >> c;
  if ( c != '.' )
    return false;

  //
  is >> t;
  lotto.day = char( t );
  is >> c;
  if ( c != '.' )
    return false;

  // read rest of fields...

  // end of line
  while ( is.get( c ) && isspace( c ) && c != '\n' )
    ;
  if ( ! is.eof() && c != '\n' )
    return false;


  // check data
  if ( lotto.month > 12 )
    return false;

  // check rest of data...

  return is.good();
}


int main()
{
  ifstream is( "yourfile.txt" );
  if ( ! is )
    return -1;

  Lotto lotto;
  while ( read( is, lotto ) )
  {
    // ...
  }
  if ( !is.eof() )
    return -1;


  return 0;
}