2016-07-17 4 views
1
#include<fstream> 
#include<iostream> 
using namespace std; 
int main() 
{ 
    int i = 20; 

    fstream fs("someFile.dat", ios::out | ios::binary | ios::in); 
    if(!fs) 
    { 
     cout << "FILE COULD NOT BE OPENED" << endl; 
    } 

    fs.write(reinterpret_cast<const char*>(&i),sizeof(int)); 
    i = 0; 
    fs.read(reinterpret_cast<char*>(&i),sizeof(int)); 
    cout << i << endl; // shows 0 
} 

を読んでIは、最後にはcoutに20が表示されるはずですが、それはファイルへの書き込み後0プログラムは罰金書いていないが、

+1

ステップ1:読み取り/書き込み操作が成功したかどうかを確認します。私は推測し、読み込みに失敗したと言います(Alexanderの答えを参照) – Borgleader

+0

あなたは何を求めていますか? –

答えて

3

を示し、あなたはファイルの末尾にあります。

あなたがtellgを使用してこれを理解、または「取得伝える」ことができます。

std::cout << "Position in file is: " << fs.tellg() << std::endl; 

これは、バイトはファイルの先頭から、あなたがファイル内にあるオフセットを教えてくれます。ファイルからバイトを読み取るには、まずファイル内の適切な位置を探さなければなりません。これを行うには、seekg、または "seek get"を使用できます。

fs.seekg(0); 

これは、ファイル(ファイルの先頭からのオフセット0バイト)の始まりを求めて、あなたは正しくファイルから読み取ることができるはずです。入力用

tellgtellpがそうであるように、あなたたとえば、seekgseekpは、同一でなければならないが、あなたは理想的な(「取得」のために)「G」で終わるメンバ関数を使用する必要がありますストリーム、およびで終わる機能」出力ストリームのための "p"( "put"の場合)。良い点は、@Borgleaderのコメントで育った

EDIT

読み取りが失敗した場合には、より複雑な例については、あなたが知らないかもしれません。そのためには、フェイルビットチェックすることができますiostateフラグを分析するには

if (fs.fail()) { 
    // you can check more specific error codes with std::ios_base::iostate 
    // fs.fail() will evaluate to 0 if no error, or false, otherwise it has an error 
    std::cout << "Failed to read from file" << std::endl; 
} 

UPDATE

を、あなたはfstreamのメンバー関数goodeoffailbadを使用することができます。オリジナル例えばfstreamののiostateをチェックする簡単な例は次のとおりです。

End of file 
Failed to read, failbit 

全体的に、多くの場合、読み取りに失敗した場合はチェックをしない限り、十分である:実行は次の出力を生成

#include <fstream> 
#include <iostream> 

int main() 
{ 
    int i = 20; 
    std::fstream fs("someFile.dat", std::ios::out | std::ios::binary | std::ios::in); 
    fs.write(reinterpret_cast<const char*>(&i), sizeof(int)); 
    i = 0; 
    fs.read(reinterpret_cast<char*>(&i), sizeof(int)); 
    // you can check other settings via the ios::fail() member function 
    if (fs.good()) {   // checks goodbit 
     std::cout << "File is normal, no errors\n"; 
    } 
    if (fs.eof()) {   // checks end of file 
     std::cout << "End of file\n"; 
    } 
    if (fs.fail()) {   // checks failbit or badbit 
     std::cout << "Failed to read, failbit\n"; 
    } 
    if (fs.bad()) {    // checks the badbit 
     std::cout << "Failed to read, badbit\n"; 
    } 
} 

これ、ロジックをさらに洗練する必要があります。

+2

これは、それらの関数の命名がどれほどひどいものかを示しています。 – Puppy

+0

ああ、ありがとう、それは働いた。ファイルに書き込むときには**ファイル位置ポインタ**を置くことしか考えられませんでした。私は知らなかった**ファイル位置ポインタ**オフセットも取得する。ありがとう、たくさんの男、それは私の最初の質問stackoverflow、私は正しい答えを期待していませんでした。 –

+0

もちろん@AhmadJamalMughalです。私の回答がうまくいっていれば、それが最良の答えです。質問を閉じることができるように、答えを正しいものとしてマークしてください。 –

関連する問題