VS2005でtest.exe から test.dll(VC++)を呼んで、プログラムを作っています。
しかし、デバッグの時に、以下の例外が発生しました。
test.exe の 0x7c812a5b で初回の例外が発生しました:
Microsoft C++ の例外: int (メモリの場所 0x00115820)。
以上の例外は、どういう意味でしょうか?
メモリのアクセスのエラーでしょうか?
ソースコードは以下のようになります。
test.dllプログラムの構造としては、以下のようになります。
char readrecordTemp[READ_SIZE + 1];
memset(readrecordTemp,0x00,sizeof(readrecordTemp));
char returncode1 = 0;
char returncode2 = 0;
try{
for(;;){
if (NULL == fgets(readrecordTemp,VT_MAX_READ_SIZE, m_fp)){
if (ferror(m_fp)){
throw ERROR_IO;
}
if (feof(m_fp)){
throw EOF;
}
}
returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];
returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ];
。。。。
。。。。
}
ファイルの最後になったら、自分が定義した例外で
returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];
returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ];
などを飛ばしたいですが、デバッグの時に、
returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];のところで
以上の例外が出されました。readrecordTempが短すぎると長すぎると
問題になるといわれてましたが、実際にどういう問題でしょうか?
readrecordTempは2より短いときに、問題だが、ではどうやって
回避できるでしょうか?
readrecordTempの最後の二つの符号を取りたいですが、
どうすればいいですか?
No.3ベストアンサー
- 回答日時:
>readrecordTempの最後の二つの符号を取りたい
>改行コードが入ることです。
fgetsなどのC言語のファイルストリーム関数では
「改行コードは、LFのみの1バイト」
です。
扱っているファイル内の改行コードが「CR+LF」の2バイトであっても、C言語のファイルストリーム関数は、内部で「LFのみ」に変換します(但し、ファイルをバイナリモードで開いている場合を除く)
なので
「改行が2バイトだと思いこんでいる限り、思った通りには動かない」
でしょう。
質問者さんのプログラムでは「改行のみの行」をfgetsした場合、readrecordTempの中身は「"\n"+EOS」になり、strlen(readrecordTemp)は「1」になります。
質問者さんは「改行のみの行を読んだら、readrecordTempの中身は"\r\n"+EOSになり、strlen(readrecordTemp)は2になる。1になる事は無い」と勘違いしていますから
returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];
の行で例外が起きる筈はない、と思い込んでいます。
しかし、readrecordTempは「"\n"+EOS」や「""+EOS」になる事があり、strlen(readrecordTemp)は1や0など、2未満になる可能性があります。
strlen(readrecordTemp)が1や0になれば
returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];
や
returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ];
の行で
readrecordTemp[ -2 ]
や
readrecordTemp[ -1 ]
に対してアクセスするので、例外が発生して当然です。
まずは「改行コードは1バイトである」と「fgetsしたら、読み込んだ文字列の文字列長が0や1になる事がある」と言う事を理解しましょう。
これが理解出来て居ないので、同じような質問を何度も繰り返し、そのたびに明確な回答が得られず、再質問の繰り返しになるのです。
No.2
- 回答日時:
>readrecordTempの最後の二つの符号を取りたい
最後の二つの符号、の意味がわかりません。
No.1
- 回答日時:
> 実際にどういう問題でしょうか?
readrecordTemp[]で確保していないメモリ領域へのアクセスが発生します。
2未満の方は言うまでもありませんが、VT_MAX_READ_SIZEがREAD_SIZEより大きい場合にも問題が出る可能性がありますね。
#というかこの二つは同じ定数使った方がいいんでは?
> どうやって回避できるでしょうか?
strlen(readrecordTemp)の値を見て、異常が出る値(2未満とかREAD_SIZE+1以上とか)ならエラー処理をすればよいのでは。
どんなエラー処理が必要なのかはこれだけではなんとも言いようがないのでご自身で考えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
ソースコードの1行が長いとき...
-
C++で空Enterの入力を判...
-
COBOLの改行
-
グレープシティのSPREAD...
-
C++でのCRLFについて
-
C言語について。
-
awkで改行を除いて文字列を抜き...
-
JAVA System.out.println の ...
-
改行を読み飛ばす
-
最終行の改行について
-
バーコード入力と手入力の判断...
-
VB6でブラウザのページソースを...
-
ファイル内の1行(レコード)から...
-
C# DataGridViewのセルを改行禁...
-
ラベル(スタティックテキスト)...
-
C++例外の回避方法
-
コンボボックスの項目中に改行を
-
文字列型変数に1024を超えた文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
C++で空Enterの入力を判...
-
改行について
-
ファイルから読み取った改行文...
-
jsp 改行コードで改行させて表...
-
C++でのCRLFについて
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
テキストファイルから改行コー...
-
JavaDoc コメントの改行について
-
JavaMail,本文中の改行について
-
【VBA】エクセルで最後の不要な...
-
文の改行
-
VBAでCSVをExcelに取り込む時に...
-
ラベル(スタティックテキスト)...
-
テキストボックス行の桁数を制...
-
改行コード(CR/LF)の設...
おすすめ情報