ifstreamで

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
SUE
記事: 41
登録日時: 8年前

ifstreamで

#1

投稿記事 by SUE » 7年前

ファイル読み込みをしようと思ってこんなコードを書きました。

コード:

using namespace std;

int main(){

	const char* name = "common.dat";

	ifstream ifs( name, ifstream::binary );

	ifs.seekg( 0, fstream::end );
	unsigned end = ifs.tellg();

	ifs.clear();

	ifs.seekg( 0, fstream::beg );
	unsigned beg = ifs.tellg();

	unsigned size = end - beg;

	char* buf = new char[ size ];
	memset( buf, 0, size );

	ifs.read( buf, size );

	cout << buf;

	delete[] buf;
	while(1){
		;
	}
	return 0;
}
入力ファイル

コード:

1
others.dat
eof
出力

コード:

1
others.dat
eofォォォォォォォォ・
と、こんな感じにゴミがくっついてきてしまいます。ifstream::binaryを外せばなくなりますが、そういうわけにも行かない状況です。
(しかも外したとて、ファイル中に改行がないと同じようにゴミがつきます。まあ今回は無視して大丈夫ですが・・・)

どうすればこのゴミを消せるのかお教え願います。
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

アバター
a5ua
記事: 199
登録日時: 9年前

Re: ifstreamで

#2

投稿記事 by a5ua » 7年前

コード:

cout << buf;
は、bufをゼロ終端文字列とみなして出力するので、
bufのサイズは、ヌル文字'\0'の分を考慮して、size + 1としなければならないと思います。

もしくは、1文字ずつ出力することも考えられます。

コード:

for (int i = 0; i < size; ++i) cout << buf[i];

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: ifstreamで

#3

投稿記事 by beatle » 7年前

根本的な原因は、ifs.readでbufにデータを読み込んだあと、NULL文字をbufに書き込んでいないことにありますね。
bufのサイズを読み取るバイト数+1にするのと同時に、読み取ったバイト数の次のバイトにNULL文字を書き込むのを忘れないようにしましょう。
(memsetでNULL文字を書きこんでいるのだ!というのであればそれで結構です)

アバター
SUE
記事: 41
登録日時: 8年前

Re: ifstreamで

#4

投稿記事 by SUE » 7年前

>>a5uaさん
基本的なとこでしたね・・・見落としていました。

>>beatleさん
言われた通りにして成功しました。
memsetで0クリアしてるのにそれは変じゃね? とか思ってしまいましたが、ifstream::read自体が余計なゴミを引き連れていました。

お二方ありがとうございました。こういう、簡単だけど根源的な問題はやはり大事にすべきですね。
オフトピック
どんなサイトを探しても以上を指摘してるところは無かったけどね・・・
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】

たかぎ
記事: 328
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: ifstreamで

#5

投稿記事 by たかぎ » 7年前

原因はすでに指摘されている通りです。
一応参考までに、ファイルの内容をすべて読み込む方法も書いておきます。

コード:

std::ifstream ifs(name);
std::ostringstream oss;
oss << ifs.rdbuf();
std::string str(oss.str());  // ファイルの内容が取得できた。

閉鎖

“C言語何でも質問掲示板” へ戻る