2009-03-01 7 views
2

バイナリファイルから1つのintを読み取ることができるFILE(fopen?)の関数はありますか?C++ FILE readInt関数? (バイナリファイルから)

これまでのところ、私はこれを試していますが、私には言わずにプログラムがクラッシュするだけで何らかのエラーが発生しています。

void opentest() 
{ 
    FILE *fp = fopen("dqmapt.mp", "r"); 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    int * buffer; 
    if (fp) 
    { 
     buffer = (int *) (sizeof(int)); 

     i = (int) fread(buffer,1, (sizeof(int)), fp); 
     fscanf(fp, "%d", &j); 
     fclose(fp); 
    } 

    printf("%d\n", i); 
    printf("%d\n", j); 
} 
+0

-1不明な質問の場合。バイナリ形式でint形式で保存するか、テキスト形式で保存するか、その他の形式で保存したいかどうかは言及されていません。また、C++で従来のCインターフェイスを使用する方法を尋ねるので、非常に有用な質問でもありません。代わりにiostreamsを使用してください。 – flodin

+0

彼は質問する正しい質問を知らなかったので、彼に投票する必要はありません。 –

+0

"buffer =(int *)(sizeof(int));" malloc()や何かの呼び出しであるはずですか? – bk1e

答えて

7

質問が変更されましたので、お聞かせください。あなたが読もうとしているファイルの形式は何ですか?簡単に内容に

/* C way */ 
FILE *fp = fopen("text.bin", "rb"); /* note the b; this is a compound mode */ 

/* C++ way */ 
std::ifstream ifs("test.txt", ios::in | ios::binary); 

読書:ファイルを開く方法をバイナリファイルの場合

が必要ないくつかの変更があります。しかし、あなたのファイルには最初の2つの整数があることを覚えておいてください。だから、最初の2つの整数を最初に読むことが最善の策です。 2つのバッファーを使用する必要があります.1つは幅と高さ、もう1つはファイルの残りの部分を読み取るための値です。

/* C way */ 
fread(buf, sizeof(int), 2, fp); /* the syntax changes, FILE pointer is last */ 

/* C++ way*/ 
ifs.read(buf, sizeof buf); 

、トリッキーな部分:二つの整数で

char buf[ 2 * sizeof(int) ]; /* will store width and height */ 

読む:だから、最初の二つの整数で読むことができます。あなたはものを二重に変換する必要があります。これは、シンプルな割り当てが動作するかどうか、またはバイトスワップが必要かどうかにかかわらず、システムのエンディアンに依存します。別のポスターが指摘したように、WriteInt()はビッグエンディアン形式の整数を書きます。あなたはどのシステムにいるのか把握する。そして、あなたはさらに進むことができます。

FILEは、Cデータ構造です。これは、C互換性のためにC++に含まれています。

/* The C way */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    FILE *fp = fopen("test.txt", "r"); 
    int i = 0; 
    if (fp) { 
     fscanf(fp, "%d", &i); 
     fclose(fp); 
    } 
    printf("%d\n", i); 
} 

あなたが読書のためのファイルを開くにはstd::ifstreamものを使用することができます:あなたはこれを行うことができます。ファイルの内容を読んで、必要な情報を自分自身から抽出するには、他の手続きを使って内容を読み込まなければなりません。

/* The C++ way */ 
#include <fstream> 
#include <iostream> 

int main() { 
    std::ifstream ifs("test.txt"); 
    int i = 0; 
    if (ifs.good()) { 
     ifs >> i; 
    } 
    std::cout << i << std::endl; 
} 

あなたは、これが最も推奨される方法ですが、同様にC++でCスタイルの関数を使用することができます注:

/* The C way in C++ */ 
#include <cstdio> 
#include <cstdlib> 

int main() { 
    using namespace std; 
    FILE *fp = fopen("test.txt", "r"); 
    int i = 0; 
    if (fp) { 
     fscanf(fp, "%d", &i); 
     fclose(fp); 
    } 
    printf("%d\n", i); 
} 

[注:両方の例は、あなたが読んでテキストファイルを持っていると仮定から]

+0

バイナリファイルでこれを行う方法を教えてください。 – William

+0

バイナリファイルの形式を指定する必要があります。 – dirkgently

+0

JavaのwriteInt()メソッドからのものです。それは単純なマップファイルです。 (幅*高さ)に等しいintの数よりも幅、高さが小さい – William

2

intのテキスト表現を読みたいですか?そして、あなたがfscanfを使用することができ、それはあなたには、いくつかのバイナリデータを読み取り、intとしてこれを扱いたい場合は、よくそれはそれが最初の場所で書かれたかに依存して起こっているのprintf

int n; 
if(fscanf(filePointer, "%d", &n) == 1) 
    // do stuff with n 

の反対のようなものです。


私はJavaプログラマはないですので、これはちょうどそれが

は書き込みと言い、私は[ドキュメント](http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataOutputStream.html#writeInt(int))

言ったで読んだことに基づいていますintを基本となる出力ストリームの上位4バイトとして出力します。例外がスローされない場合、カウンタは4だけインクリメントされます。

したがって、ビッグエンディアンの4バイト整数。私はそれが2の補数かどうかは分かりませんが、それはおそらく安全な前提です(おそらくjava docs/specのどこかにあります)。ビッグエンディアンはネットワークバイトオーダーと同じですので、ntohlを使用してC++プラットフォームのエンディアンを変換することができます。それ以外の場合は、4バイトを読み取るだけです。これはfreadで行うことができます。

+0

バイナリは、JavaのwriteInt()メソッドを使用して記述します。ファイルは "¬ 'wl" – William

0

intはテキストまたはバイナリで表されますか?

テキストの場合は、fscanfを使用してください。バイナリの場合はfreadを使用します。

関連する問題