2017-08-12 5 views
0

だから、アイブ氏はコマンドライン引数を使用してバイナリファイルを読み込み、Cでそれを表示する方法は?

struct records { 
    short link; 
    double gate; 
    unsigned char bar; 
    int rest; 
    char rink; 
}; 

の構造体を持って、今私は、バイナリ入力を読み、fread()を使用してそれらをプリントアウトしたいです。私は正確に何をするかを考え出すのが難しいだけです。

は、だから私は唯一したがって、最初のオフ

int main(int argc, char* argv[]){ 
} 

を持って、どのようにバイナリファイルを開くのですか?私がオンラインで見たすべての例はmain()を使用し、fopen()を使用するときは常に入力を指定します。コマンドライン引数を使用して開くファイルを指定するにはどうすればよいですか?

そして、それらのファイルを作成してプリントアウトしたstructにどのように読み込むのですか?

ご協力いただきありがとうございます。

+0

ヒント1:あなたが ''リターン0忘れてしまった; '' ''メイン()の結果を返すために、 ''ステートメントを。ヒント2:ヒント1を変更したら、returnステートメントでブレークポイントを設定し、プログラムに異なるコマンドライン引数を指定しながらargcとargvの内容を調べます。 – BitTickler

答えて

2

プログラムを実行するときに、バイナリファイルの名前を引数として指定します。

argv[0]は、プログラム自体の名前とファイル名がargv[1]になります。

コメントに記載されているとおり、argv[1]が実際に存在していることを確認してからアクセスするとエラーが発生します。

if(argc<2) 
{ 
    printf("\nError"); 
    return -1; 
} 

よう

何かがそれの世話をする必要があります。

その後

FILE *fin=fopen(argv[1], "rb"); 

を行い、その後、ファイルからの読み込みにfread()を使用しています。

fopen()の第2引数は、ファイルが開かれたのモードです。 "rb"のrとbはそれぞれ読み出しと2進を意味します。

fread()については、まずstruct recordsの変数aを作成します。

その後、我々は、読み出したデータが保存されますので、aのアドレスを渡す。ここ

fread(&a, sizeof(a), 1, fin); 

を使用しています。 sizeof(a)は、それぞれのブロックのサイズがfread()で、1が読み込むブロックの数であると言います。

fread()は、正常に読み取られたブロック数を返します。私たちの場合は1です。 読み込みを要求したブロックの数と実際に読み込まれたブロックの数が同じでない場合、ファイルが終了したか、何らかのエラーが発生しました。

その後、aの各要素にアクセスできます。

https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm http://pubs.opengroup.org/onlinepubs/009695399/functions/fread.html

+0

ありがとうございます。 'argc <2'のようなエラー処理と' if(fin == null) 'のようなものがありました。あなたは 'fread()'についてもっと詳しく教えていただけますか? –

+0

@AlonzoRobbeもう少しのコンテンツを追加しました。それが役に立てば幸い。 –

+0

もう一度ありがとうございます。私はいくつかの質問があります。まず、 'fread'の' 1'は、 'struct'からどれだけのものが読み込まれているのか、' structs'がどれだけあるのかを表していますか?だから、私の 'struct'のために、それはまだ' 1'か '5'でしょうか?次に、 'a 'の各要素にアクセスしてそれを印刷するには、' a [1] 'に対して' printf( "%d"、a [0]) 'などをしますか?最後に、「各フィールドを独自の 'fread'呼び出しで個別に読み込むように」と言われました。これはあなたが言ったことと異なっていますか? –

関連する問題