ページ 11

テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 14:58
by ノダッシー
こんにちは、お久しぶりです
テキストファイルから文字列を読み込み、1行ずつchar message[0]~message[3]に代入しようと思いますが
今のままデバッグして実行をするとプログラムが応答しなくなってしまいます
どのようにコードを書きかえればいいのでしょうか
よろしくお願いします

コード:

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>

#define MAX_STRINGS 80

void main(void)
{
	char message[3];
	char filename[] = "test.txt";
	FILE *fp;
	char data[MAX_STRINGS];
	int i=0;

	/* ファイル・オープン */
	if ((fp = fopen(filename, "r")) == NULL)
	{
		printf("ファイル「%s」のオープンに失敗しました。プログラムを終了します。\n", filename);
		exit(1);
	}

	/* データ処理 */
	while (fgets(data, MAX_STRINGS, fp) != NULL)
	{
		printf("%s", message[i]);
		i++;
	}

	/* ファイル・クローズ */
	fclose(fp);

}
/*test.txtの中身
あいうえお
かきくけこ
さしすせそ
たちつてと
*/

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 15:37
by Rittai_3D
while中の i が3以上になるから範囲外アクセスで落ちるのではないでしょうか。
iの値を確認してみてください。

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 16:07
by ノダッシー
早速の返信ありがとうございます
iの値を確認してみました
配列の数を上回ってしまうという事までは分かったのですが、コードの書き方がわかりません
検索しても出てこないので、ご教示願えませんでしょうか

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 16:19
by みけCAT
ノダッシー さんが書きました:テキストファイルから文字列を読み込み、1行ずつchar message[0]~message[3]に代入しようと思いますが
現状のコードでは
・message[3]は確保されていません。アクセスは避けるべきです。
・message[0]~message[2]には1文字(1バイト?)しか入りません。「あいうえお」などのデータは代表的な環境では入らないでしょう。
・せっかく読み込んだdataが読み出されていません。
・message[0]~message[2]は明示的に初期化されていません。
 入っているのが0であっても不定の値であってもポインタとして%sで「そこに格納されている」文字列を出力しようとしたら、落ちる可能性が高いと思います。
 たまたま応答なしになったのは不思議ですね。

修正してみました。

コード:

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINES 4
#define MAX_STRINGS 80

int main(void)
{
	char message[MAX_LINES][MAX_STRINGS];
	char filename[] = "test.txt";
	FILE *fp;
	int i=0;

	/* ファイル・オープン */
	if ((fp = fopen(filename, "r")) == NULL)
	{
		printf("ファイル「%s」のオープンに失敗しました。プログラムを終了します。\n", filename);
		exit(1);
	}

	/* データ処理 */
	while (i<MAX_LINES && fgets(message[i], MAX_STRINGS, fp) != NULL)
	{
		printf("%s", message[i]);
		i++;
	}

	/* ファイル・クローズ */
	fclose(fp);

	return 0;
}
/*test.txtの中身
あいうえお
かきくけこ
さしすせそ
たちつてと
*/

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 16:25
by Rittai_3D
messageの要素を増やせばいいと思います。
オフトピック
現在のコードではmessageは無くても困らないと思いますが、なにをするための変数なのでしょうか?代入も初期化もなにもしてない気がします。

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 16:31
by みけCAT
Rittai_3D さんが書きました:
オフトピック
現在のコードではmessageは無くても困らないと思いますが、なにをするための変数なのでしょうか?代入も初期化もなにもしてない気がします。
ノダッシー さんが書きました:テキストファイルから文字列を読み込み、1行ずつchar message[0]~message[3]に代入しようと思いますが
これが目的ではないでしょうか?

Re: テキストファイルから読み込みたい

Posted: 2015年2月17日(火) 16:56
by Rittai_3D
みけCAT さんが書きました:
Rittai_3D さんが書きました:
オフトピック
現在のコードではmessageは無くても困らないと思いますが、なにをするための変数なのでしょうか?代入も初期化もなにもしてない気がします。
ノダッシー さんが書きました:テキストファイルから文字列を読み込み、1行ずつchar message[0]~message[3]に代入しようと思いますが
これが目的ではないでしょうか?
すいません、見落としていました。ご指摘ありがとうございます。

Re: テキストファイルから読み込みたい

Posted: 2015年2月18日(水) 15:40
by ノダッシー
Rittai_3DさんみけCATさんありがとうございました!
みけCATさんのコードを使って今作っているプログラムに組み込んだところ
テキストファイルから拾った文字列は表示できるのですが、語尾に文字化けのような 「・」が表示されてしまいます


おはようございます・←

何か解決方法はありますでしょうか?

Re: テキストファイルから読み込みたい

Posted: 2015年2月18日(水) 22:06
by みけCAT
ノダッシー さんが書きました:みけCATさんのコードを使って今作っているプログラムに組み込んだところ
テキストファイルから拾った文字列は表示できるのですが、語尾に文字化けのような 「・」が表示されてしまいます


おはようございます・←

何か解決方法はありますでしょうか?
組み込んだプログラムがわからないので予想ですが、末尾の改行文字を消すといいかもしれません。

コード:

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINES 4
#define MAX_STRINGS 80

int main(void)
{
	char message[MAX_LINES][MAX_STRINGS];
	char filename[] = "test.txt";
	FILE *fp;
	int i=0;

	/* ファイル・オープン */
	if ((fp = fopen(filename, "r")) == NULL)
	{
		printf("ファイル「%s」のオープンに失敗しました。プログラムを終了します。\n", filename);
		exit(1);
	}

	/* データ処理 */
	while (i<MAX_LINES && fgets(message[i], MAX_STRINGS, fp) != NULL)
	{
		char *lf;
		for (lf = message[i]; *lf != '\0'; lf++)
		{
			if (*lf == '\n')
			{
				*lf = '\0';
				break;
			}
		}
		printf("%s\n", message[i]);
		i++;
	}

	/* ファイル・クローズ */
	fclose(fp);

	return 0;
}
/*test.txtの中身
あいうえお
かきくけこ
さしすせそ
たちつてと
*/

Re: テキストファイルから読み込みたい

Posted: 2015年2月19日(木) 13:23
by ノダッシー
'¥n'を見つけたら'\0'文字列終端マークを代入するのですね
解決致しました
ありがとうございました!