C言語のファイル操作で質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bitter_orange

C言語のファイル操作で質問です。

#1

投稿記事 by bitter_orange » 16年前

初めまして。
題名の通りファイル操作について質問させていただきます。
ファイルから文字列を読み込みその文字列をバイナリファイルで出力し、そのバイナリファイルを読み込みたいのですがうまくいきません。
理由はわかりませんが、バイナリファイルをうまく読み込めていない状態です。
また、文字列をバイナリファイルで出力してもメモ帳等で開くと普通に読めるのでしょうか。
数字で試したときは関係のない文字等が出てきたのですが文字列をバイナリで出力しても変わりありません。
その時、改行が無効になってしまいます。
(元:おはよう。(改行)→(改行)→こんにちは。 出力後:おはよう。こんにちは。 という状態です)
自分は下記のようなプログラムにしています。コンパイルエラーはありません。
OSは[Windows Vista]で開発環境は[Microsoft Visual C++ 2008 Express Edition]です。

// 以下プログラム

#include <stdio.h>
#include <string.h>

// 警告防止用
#pragma warning( disable: 4996 )

int main(int argv,char *argc[/url])
{
FILE *fp;
	int loop = 0;
	char str1[3][256] = {};
	char str2[3][256] = {};

	// 読み込み(事前にname.txtというファイルを作成して文字列を入力しました)
	if(!(fp = fopen("name.txt", "r+"))){[pre]
                  perror("ファイルの読みに失敗しました。");
		return -1;
}
for(loop = 0; loop < 3;loop++)
fgets(str1[loop],256,fp);
fclose(fp);

// 確認用
for(loop = 0; loop < 3;loop++)
printf("str1 = %s",str1[loop]);
// バイナリモードで書き込み
fp = fopen( "name_r.txt", "wb");
for(loop = 0; loop < 3;loop++)
fwrite(str1[loop],sizeof(char),strlen(str1[loop]),fp);
fclose(fp);

// バイナリモードで読み込み
fp = fopen( "name_r.txt", "rb");
for(loop = 0; loop < 3;loop++)
fread(str2[loop],sizeof(char),strlen(str2[loop]),fp);
fclose(fp);

// 確認用
for(loop = 0; loop < 3;loop++)
printf("str2 = %s",str2[loop]);
return 0;[/pre]
}

// 以上
どのように訂正したらよいのでしょうか?
よろしくお願いします。

SCI

Re:C言語のファイル操作で質問です。

#2

投稿記事 by SCI » 16年前

一部に全角空白があったので、そのままではエラーになりますね。

> char str1[3][256] = {};
> char str2[3][256] = {};
BCCではエラーです。

> // バイナリモードで書き込み
> fp = fopen( "name_r.txt", "wb");
バイナリモードでは改行コードが変換(0x0A→0x0D0A)されないので、後からテキストとしてみたときに改行が消えたように見えます。
書き込みモードを"w"にすれば改行がちゃんと入ります。
あ、それから一番最初の読み込みでは、書き込む予定がないなら"r"で十分ですよ。

> fread(str2[loop],sizeof(char),strlen(str2[loop]),fp);
(初期化されていれば)str2にはまだ文字列が入っていないので、ここでstr2に対してstrlenすると読み込むサイズは0バイトです。
初期化されていなかったら、そのサイズも不定になります。


テキストデータもバイナリデータの一部なので、バイナリモードで書き込んでもデータ隠蔽にはなりません。
数値データが記号の羅列になったように見えることについては、文字コードについて調べてみると分かりますよ。

SooA

Re:C言語のファイル操作で質問です。

#3

投稿記事 by SooA » 16年前

// バイナリモードで読み込み
	fp = fopen( "name_r.txt", "rb");
	for(loop = 0; loop < 3;loop++)
 		fread(str2[loop],sizeof(char),[color=BBFFBB>strlen(str2[loop])[/color],fp);
	fclose(fp);

保存されたデータを読み込むところですが、
この時点で str2[/url]にデータが入っていないので
strlen( str2[loop] ) としても文字列の長さは返りません。

fgets() を使って読み込むか、str1から長さを取得する、
保存時に固定長で保存する、などしましょう。

SooA

Re:C言語のファイル操作で質問です。

#4

投稿記事 by SooA » 16年前

追記
以下■の部分に全角スペースが使われています。
投稿コメントにのみ追加したならプログラム的には問題ありませんが…
if(!(fp = fopen("name.txt", "r+"))){
■■■■■■■■perror("ファイルの読みに失敗しました。");
		return -1;	}
	for(loop = 0; loop < 3;loop++)
■■■■■■■fgets(str1[loop],256,fp);

toyo

Re:C言語のファイル操作で質問です。

#5

投稿記事 by toyo » 16年前

バイナリモードとテキストモードの違いはWindowsでは改行コード変換の有無だけです
読み込み時にはCR+LFの2バイトがLFの1バイトに変換(このままバイナリで書き込むとメモ帳では改行が反映されなくなります)
書き込み時にはLFの1バイトがCR+LFの2バイトに変換(メモ帳でも改行がちゃんと表示されます)
Linuxでは両者に違いはなくバイナリモード、テキストモードの部分は無視されます

bitter_orange

Re:C言語のファイル操作で質問です。

#6

投稿記事 by bitter_orange » 16年前

多くのご返信ありがとうございます。
fgetsに置き換えたらうまくいきました。
皆様、ご指導ありがとうございました。

全角の空欄は編集して半角の空欄に訂正しました。
<pre></pre>がうまく使えなかったので、その一部分を空白で補いましたがミスで全角で入力してしまいました。
すみませんでした。

Huzzy

エラーメッセージの意味;;

#7

投稿記事 by Huzzy » 16年前

前回に引き続き、龍神録第32章のプログラムを
組んでいたのですが、以下のエラーメッセージ×2が
一向に消えてくれません;;


1>boss_shotH.obj : error LNK2019: 未解決の外部シンボル "double __cdecl bossatan3(int,double,double)" (?bossatan3@@YANHNN@Z) が関数 "void __cdecl boss_shot_bulletH006(void)" (?boss_shot_bulletH006@@YAXXZ) で参照されました。

1>D:\c++\mikudius\miku3\Debug\miku3.exe : fatal error LNK1120: 外部参照 1 が未解決です。


それまでのエラー(文法・誤字脱字ミス等)はダブルクリックで
特定の箇所を自動判別できたのですが、この2つはそれも出来ません。
この章に、至るまで何度かこのような判別不能のメッセージが
出てきたのですが(今までは疾駆八苦の末、奇跡的に消えました;) 
今回はお手上げ状態です;;

何方かこの2つのエラーメッセージの表している意味、もしくは
どの辺りを変更しろと言っているのか?
を判断出来る方がいらっしゃいましたら、ご教授の程
よろしくお願いします。

SooA

Re:エラーメッセージの意味;;

#8

投稿記事 by SooA » 16年前

boss_shotH.obj ( boss_shotH.cpp ) 内の
boss_shot_bulletH006() で bossatan3() って関数を
使ってるけど該当する関数が見つからないって感じのメッセージです。

定義されてますか?
リビルドしてもエラー出ますか?

dic

Re:エラーメッセージの意味;;

#9

投稿記事 by dic » 16年前

プロジェクごとソースをアップしてくれれば
エラーが分かるかと思います

私の環境 VC++6 では第32章はコンパイルできました

huzzy

Re:エラーメッセージの意味;;

#10

投稿記事 by huzzy » 16年前

返答有り難う御座います。

確認したところ、boss_shot.cpp内の
double bossatan3を書き忘れているという
単純なミスでした;;

ご指導有り難う御座いました。

閉鎖

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