1

1 つのテキスト ファイルから情報を読み取り、それを bin ファイルに出力しています。名前はちゃんと書いてもらったのですが、整数と倍精度がうまくいきません。システム(「一時停止」)を無視して、出力を確認できるようにします。

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

struct SaleSlip{
    char name[20];
    int prodID;
    double value;
};

void main(){

    fstream slips, binslip;
    SaleSlip sales[17];
    binslip.open("SaleSlips.bin", ios::out | ios::binary | ios::trunc);
    slips.open("SaleSlips.txt", ios::in);
    if(slips.eof()){
        cout << "Cannot open file - SaleSlips.txt"<< endl;
        system("pause");
        exit(2);
    }
    int i = 0;
    while(!slips.eof()){
        slips >> sales[i].name;
        slips.ignore(80, ' ');
        slips >> sales[i].prodID;
        slips.ignore(80, ' ');
        slips >> sales[i].value;
        slips.ignore(80, '\n');
        cout << sales[i].name;
        cout << sales[i].prodID;
        cout << sales[i].value << endl;

        binslip.write((const char *)&sales[i].name, sizeof(sales[i].name));
        binslip.write((const char *)&sales[i].prodID, sizeof(sales[i].prodID));
        binslip.write((const char *)&sales[i].value, sizeof(sales[i].value));
        i++;
    }
    slips.close();
    binslip.close();
    system("pause");
}

SaleSlips.txt には、配列の項目ごとに 1 行あるため、「Ryan 2 1400.52」は 1 行です。Ryan は正しく解釈されますが、バイナリから再度読み込んだときも、テキストパッドでチェックしたときも正しくありません。

4

2 に答える 2

2

binslip.writeUnformattedOutputFunctionです。書式付きおよび書式なしの入出力があります。フォーマットされていない出力を使用すると、未加工のバイトがファイルに書き込まれます。バイトが実際に何を表しているかについての解釈はありません。

SalesSlips.bin に書き込むときは、文字の後に数字を書きました (むしろ、数字だと思っていたものです)。SalesSlips.bin を調べようとしたとき、コンピューターはテキスト文字を読み取り、ファイルの残りの部分がテキストであることを期待していましたが、そうではありませんでした。数字は、文字とは異なる方法で表現されます。数値だけを扱う場合でも、整数値と浮動小数点値は 2 進数では異なる方法で表現されます。今すぐ理解するのは少し難しいかもしれませんが、その要点は、FormattedOutputFunctionを使用する必要があるということです。これにより、データを適切に出力するために必要な内部変換が実行されます。

たとえば、50 という数字があるとします。その数字は、50 が何を表すかを表す単位がなければ意味がありません。50秒?50フィート?50州?単に 50 を書いていると考えbinslip.writeて、あとでファイルを読み込もうとすると 50 しか表示されず、それが何を表しているのか理解できず、意味不明に見えるのです。

binslip.writeコードを修正するには、行を次のように置き換える必要があります。

binslip << sales[i].name << sales[i].prodID << sales[i].value;

この場合、operator<<は として動作するFormattedOutputFunctionため、SaleSlips.bin を記述すると、テキスト エディターで開いてRyan 2 1400.52期待どおりに表示できます。

于 2013-07-26T04:22:08.773 に答える
1

BINARY モードで読み書きしている間は、テキスト エディタでデータを読み取る必要はありません。それは単に何の役にも立ちません。テキストエディタで読みたい場合はNORMALモードがおすすめです。

とにかく、バイナリ データをテキスト エディタで表示することを気にしない場合は、次の行を使用してバイナリ ファイルを読み書きできます。

while(!slips.eof())
{
    slips >> sales[i].name;
    slips.ignore(80, ' ');
    slips >> sales[i].prodID;
    slips.ignore(80, ' ');
    slips >> sales[i].value;
    slips.ignore(80, '\n');
    cout << sales[i].name;
    cout << sales[i].prodID;
    cout << sales[i].value << endl;

    //// WRITE THE STRUCTURE AT ONCE
    binslip.write((const char *)&sales[i], sizeof(sales[i]));
    i++;
}
binslip.flush();
binslip.close();

//// OPEN UP THE FILE IN READ MODE
binslip.open("SaleSlips.bin", ios::in | ios::binary );
SaleSlip sale;
//// READ UP THE COMPLETE STRUCTURE
binslip.read((char *)&sale, sizeof(sale));
//// PRINT IT.
cout<<sale.name;
cout<<sale.prodID;
cout<<sale.value;
于 2013-07-26T05:10:50.490 に答える