2011-01-17 7 views
0

私は現在バイナリファイルの書き込み/読み取りにfopenを使用しています。小さなファイルではすべて罰金です。しかし、場合によっては、コンテンツが「正確に」16Kを超えると、ファイルの残りの部分が無効になります。fopen - 16K以上は書き込めませんか?

コードは、fopenを...関数fread/fwriteの... fflushは... fcloseは、簡単です!

私はC++で試してみます。しかし、今、私はそれを返すBinaryDefaultReadに

を「読み」-1中に問題を抱えて!しかし、本当に理由を知らない! 私は一度に4バイトしか書きません!!!

それはMSVC 2008コンパイラでWin7の64ビットの下にあります。

#include <fstream> 

using namespace std; 

size_t BinaryDefaultRead(ifstream& stream, void* buffer, unsigned int bufferSize) 
{ 
    //return fread(buffer, 1, (size_t) bufferSize, file); 
    stream.read((char*)buffer, bufferSize); 
    if (!stream) 
     return -1; 

    return bufferSize; 
} 

size_t BinaryDefaultWrite(ofstream& stream, const void* buffer, unsigned int bufferSize) 
{ 
    //return fwrite(buffer, 1, (size_t) bufferSize, file); 
    stream.write((char*)buffer, bufferSize); 
    if (!stream) 
     return -1; 

    return bufferSize; 
} 

// Read an unsigned integer from a stream in a machine endian independent manner (for portability). 
size_t BinaryReadUINT(ifstream& stream, unsigned int* value) 
{ 
    unsigned char buf[4]; 
    size_t result = BinaryDefaultRead(stream, (void *)buf, 4); 

    if (result < 0) 
     return result; 

    *value = ((unsigned int) buf[0]) | 
    (((unsigned int) buf[1]) << 8) | 
    (((unsigned int) buf[2]) << 16) | 
    (((unsigned int) buf[3]) << 24); 

    return result; 
} 

// Write an unsigned integer to a stream in a machine endian independent manner (for portability). 
size_t BinaryWriteUINT(ofstream& stream, unsigned int aValue) 
{ 
    unsigned char buf[4]; 
    buf[0] = aValue & 0x000000ff; 
    buf[1] = (aValue >> 8) & 0x000000ff; 
    buf[2] = (aValue >> 16) & 0x000000ff; 
    buf[3] = (aValue >> 24) & 0x000000ff; 

    return BinaryDefaultWrite(stream, (void*)buf, 4); 
} 

// Read a floating point value from a stream in a machine endian independent manner (for portability). 
size_t BinaryReadFLOAT(ifstream& stream, float* value) 
{ 
    union { 
     float f; 
     unsigned int i; 
    } u; 
    size_t result = BinaryReadUINT(stream, &u.i); 

    if (result < 0) 
     return result; 

    *value = u.f; 

    return result; 
} 

// Write a floating point value to a stream in a machine endian independent manner (for portability). 
size_t BinaryWriteFLOAT(ofstream& stream, float aValue) 
{ 
    union { 
     float f; 
     unsigned int i; 
    } u; 
    u.f = aValue; 
    return BinaryWriteUINT(stream, u.i); 
} 

size_t BinaryReadUINTArray(ifstream& stream, unsigned int* buffer, unsigned int count) 
{ 
    size_t result; 
    for(unsigned int i = 0; i < count; i++) 
    { 
     result = BinaryReadUINT(stream, buffer + i); 
     if (result < 0) 
      return result; 
    } 

    return result; 
} 

size_t BinaryWriteUINTArray(ofstream& stream, unsigned int* buffer, unsigned int count) 
{ 
    size_t result; 
    for(unsigned int i = 0; i < count; i++) 
    { 
     result = BinaryWriteUINT(stream, buffer[i]); 
     if (result < 0) 
      return result; 
    } 

    return result; 
} 

size_t BinaryReadFLOATArray(ifstream& stream, float* buffer, unsigned int count) 
{ 
    size_t result; 
    for(unsigned int i = 0; i < count; i++) 
    { 
     result = BinaryReadFLOAT(stream, buffer + i); 
     if (result < 0) 
      return result; 
    } 

    return result; 
} 

size_t BinaryWriteFLOATArray(ofstream& stream, float* buffer, unsigned int count) 
{ 
    size_t result; 
    for(unsigned int i = 0; i < count; i++) 
    { 
     result = BinaryWriteFLOAT(stream, buffer[i]); 
     if (result < 0) 
      return result; 
    } 

    return result; 
} 
+10

あなたはコードを投稿することができますか? – vlad259

+3

どのプラットフォーム(OSコンパイラ)ですか? – Christoph

+0

また、どのオペレーティングシステムですか? – JeremyP

答えて

6

fopenは、ファイルストリームを開くためにのみ使用され、読み書きはできません。 freadおよびfwriteが使用されます。

fwritefreadあなたが渡した要素のすべてを書き込むことはできません。書き込まれた要素の数が返されます。要素の数は、渡した要素の数よりも少なくてもかまいません。

戻り値を確認して、すべての要素を書き出すまで、またはストリームにエラーがあるまでfwriteを続けてください:ferrorを使用してエラーをチェックしてください。 fwriteマニュアルから


のfread()および関数fwrite()アイテムの数を返す正常に読み書き(すなわち、しない文字の数)。エラーが発生した場合、またはファイルの終わりに達した場合、戻り値は短い項目数(またはゼロ)です。

関数fread()エンド・オブ・ファイルとエラーを区別せず、発信者が(3)とferror(3)発生したかを決定するためにFEOF使用しなければなりません。

+0

奇妙なことは、私が書き込むすべてのファイルが最大16キロバイトであることです!そして内容は正しい!なぜ私は16キロバイト以上を書き込めないのですか? ご存知ですか? – Spectral

+1

これは私の見解ですが、これは珍しい見方ではないと思います。要求された長さの完全な書き込みは何も返さない 'fwrite'は、本質的に致命的なIOエラーを示します。これは、ローレベルのIO(通常は 'write'、これは短い書き込みを返すことができる)を上回る唯一の重要な利点です。通常の 'fwrite'実装は、終了するかエラーが発生するまで' write'を呼び出してループします。 –

+0

@R:確かに、標準では、このビューをサポートしています:* 'fwrite'機能は、書き込みエラーが発生した場合にのみ、nmemb''よりも小さくなります正常に書き込まれ要素の数を返します*すべての答えを – caf

関連する問題