C言語のファイルの読み込みができない

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

C言語のファイルの読み込みができない

#1

投稿記事 by 萩お » 3年前

はじめまして
C言語の初心者で、ファイル読み込みのプログラミングコードがうまくいかず困っています。
最初の2行を読み飛ばしてテキストファイルを5つの配列に読み込み、その値を計算して結果を表示させたいのですがうまくいきません。
このコードが自分で作ってみたコードです。

コード:

#include <stdio.h> 
#include <math.h>
void main()
{
    int i, j, k, n;
    float r[10000], z[10000], vr[10000], vz[10000], vphi[10000], E[10000];    /* 大きめのサイズの配列を用意しておく. */
 
    FILE *fp;
 
    fp = fopen("a.txt", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.\n");
        return;
    }
 
    n = 0;
    while(fgetc(fp) != '\n' && !feof(fp)) ; /* 1行目を読み飛ばす */
    while(fgetc(fp) != '\n' && !feof(fp)) ; /* 2行目を読み飛ばす */
    /*  ファイルが終わりでない「かつ」配列を飛び出さないうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < 10000) {
        fscanf(fp, "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]),&(vr[n]),&(vz[n]),&(vphi[n]));
        n++;
    }
    fclose(fp);
 
    n = n-1; /* 上のwhileループでは,EOFの行を余分に読み込んでいるので,実際のデータ数は一つ少ない. */
 
    /*  計算  */
    for(i=0; i<n; i++) {
        E[i] = (9.11e-31*(vr[i]*vr[i]+vz[i]*vz[i]+vphi[i]*vphi[i]))/(2.0*1.6e-19);
        printf("%lf %lf %lf\n",r[i],z[i],E[i]);
    }
}
読み込んだテキストファイル名はa.txtで添付させていただいてます。
もしかすると読み込んだテキストファイルのデータが、10のべき乗をDを用いて表しているので、そこに問題があるのかもしれません。
どなたか問題点をご指摘いただけないでしょうか?
添付ファイル
a.txt
(2.27 KiB) ダウンロード数: 138 回

box
記事: 2002
登録日時: 13年前

Re: C言語のファイルの読み込みができない

#2

投稿記事 by box » 3年前

うまくいきません。
どううまくいかないのですか?詳細を伝えてください。
何をしたとき(ビルド時?実行時?)に
どういうエラーメッセージ(一字一句正確に)が出たので
うまくいかないと判断した、という内容がわからないと、
回答のしようがありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

萩お
記事: 12
登録日時: 5年前

Re: C言語のファイルの読み込みができない

#3

投稿記事 by 萩お » 3年前

ご返信ありがとうございます。肝心な部分の説明が抜けてしまい申し訳ありません。
エラーメッセージは出ず、問題なく実行されるのですが、以下のような値が出力されてしまいます。

-133796559056368670000000000.000000 0.000000 0.000000
1.546180 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000


同様に0.000000が続いていきます。
出力した配列rと配列zはテキストファイルの値と同じ値であるはずなのですが、同じ値で出力されていません。また、計算結果の配列Eの値もおかしいので、うまくいっていないと判断いたしました。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語のファイルの読み込みができない

#4

投稿記事 by あたっしゅ » 3年前

東上☆海美☆「10のべき乗でDを用いるのは Fortran みみ。C/C++ は、e みみ。a.txt の中身の D を e に置換して ae.txt にしたみみ」

コード:

//
//
//
#include <stdio.h> 
#include <math.h>


int
main()
{
    int i, j, k, n;
    #define MAX 10000
    float r[MAX], z[MAX], vr[MAX], vz[MAX], vphi[MAX], E[MAX];    /* 大きめのサイズの配列を用意しておく. */
 
    FILE *fp;
 
    //fp = fopen("a.txt", "r");
    fp = fopen("ae.txt", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.\n");
        return -1;
    }
 
    n = 0;
    {
    	const int lenMAX = 1024;
    	char      buf[ lenMAX ];
    	
		//while(fgetc(fp) != '\n' && !feof(fp)) ; /* 1行目を読み飛ばす */
    	fgets( buf , lenMAX , fp );
    	puts( buf );
    	//while(fgetc(fp) != '\n' && !feof(fp)) ; /* 2行目を読み飛ばす */
    	fgets( buf , lenMAX , fp );
    	puts( buf );
    }
	/*  ファイルが終わりでない「かつ」配列を飛び出さないうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < MAX) {
        fscanf(fp,  "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]), &(vr[n]), &(vz[n]), &(vphi[n])) ;
        printf(    "@%lf %lf %lf %lf %lf\n", r[n], z[n],vr[n],vz[n],vphi[n]);
        n++;
    }
    fclose(fp);
 
    n = n-1; /* 上のwhileループでは,EOFの行を余分に読み込んでいるので,実際のデータ数は一つ少ない. */
 
    /*  計算  */
    for(i=0; i<n; i++) {
        E[ i ] = (9.11e-31*(vr[ i ]*vr[ i ]+vz[ i ]*vz[ i ]+vphi[ i ]*vphi[ i ]))/(2.0*1.6e-19);
        printf("%lf %lf %lf\n",r[ i ],z[ i ],E[ i ]);
    }
    
    return 0;
}

// end.
#

###### time= 0.77520000e-09

@-0.000000 0.000000 0.000000 0.000000 0.000000
@-91991302144.000000 0.000000 0.000000 0.000000 0.000000
@-6857104384.000000 289262853080542990000000000000000.000000 0.000000 0.000000 0.000000
@0.000000 -0.001199 0.000000 0.000000 0.000000
@-17177022838666758000000.000000 -0.000000 2.000000 0.000000 0.000000
@-3984194888016342900000000000000000.000000 0.000000 0.000000 0.000000 0.000000
@-14107479653249712000.000000 -0.000000 0.000000 0.000000 0.000000
@-0.000000 0.000000 0.000000 0.000000 0.000000
@-3596.484619 0.000000 0.000000 0.000000 0.000000
@4180918965869213600000.000000 -139361244993650040000000000000000.000000 0.000000 0.000000 0.000000
@-0.000736 0.000002 0.000000 0.000000 0.000000
@-0.000000 0.000000 0.000000 0.000000 0.000000
@-23.600742 -0.000000 0.000000 0.000000 0.000000
@-0.000000 0.243048 0.000000 0.000000 0.000000
@176434657570802390000000000000.000000 1267339154321385800000000000000000000.000000 0.000000 0.000000 0.000000
@0.000005 -0.000000 0.000000 0.000000 0.000000
@-80265805518984756000000000000000000000.000000 0.000000 0.000000 0.000000 0.000000
@-203268915200.000000 -0.000000 0.000000 0.000000 0.000000
@-10672968564736.000000 -0.264768 0.000000 0.000000 0.000000
@0.001247 0.000000 0.000000 0.000000 0.000000
@-30303388717547520.000000 1262641972200533200000000000000000.000000 0.000000 0.000000 0.000000
@-170451.484375 2265224762699462700000.000000 0.000000 0.000000 0.000000
@-0.000000 0.000000 0.000000 0.000000 0.000000
@0.004215 6383697007508728800000000000000000000.000000 0.000000 0.000000 0.000000
@-17795993067852931000000.000000 -0.000136 0.000000 0.000000 0.000000
@-0.000000 -0.000000 0.000000 0.000000 0.000000
@-0.000000 0.000000 0.000000 0.000000 0.000000
@-4.489216 0.000000 0.000000 0.000000 0.000000
@180787319656153090.000000 8997065836354943000000000000000000000.000000 0.000000 0.000000 0.000000
@1838658304.000000 -932993472390560320000000000000000.000000 0.000000 0.000000 0.000000
@0.000000 -1394798159381382800000.000000 0.000000 0.000000 0.000000
@311109815180258470000000.000000 12363.235352 0.000000 0.000000 0.000000
@-0.000000 -0.000000 0.000000 0.000000 0.000000
-0.000000 0.000000 0.000000
-91991302144.000000 0.000000 0.000000
-6857104384.000000 289262853080542990000000000000000.000000 0.000000
0.000000 -0.001199 0.000000
-17177022838666758000000.000000 -0.000000 0.000000
-3984194888016342900000000000000000.000000 0.000000 0.000000
-14107479653249712000.000000 -0.000000 0.000000
-0.000000 0.000000 0.000000
-3596.484619 0.000000 0.000000
4180918965869213600000.000000 -139361244993650040000000000000000.000000 0.000000
-0.000736 0.000002 0.000000
-0.000000 0.000000 0.000000
-23.600742 -0.000000 0.000000
-0.000000 0.243048 0.000000
176434657570802390000000000000.000000 1267339154321385800000000000000000000.000000 0.000000
0.000005 -0.000000 0.000000
-80265805518984756000000000000000000000.000000 0.000000 0.000000
-203268915200.000000 -0.000000 0.000000
-10672968564736.000000 -0.264768 0.000000
0.001247 0.000000 0.000000
-30303388717547520.000000 1262641972200533200000000000000000.000000 0.000000
-170451.484375 2265224762699462700000.000000 0.000000
-0.000000 0.000000 0.000000
0.004215 6383697007508728800000000000000000000.000000 0.000000
-17795993067852931000000.000000 -0.000136 0.000000
-0.000000 -0.000000 0.000000
-0.000000 0.000000 0.000000
-4.489216 0.000000 0.000000
180787319656153090.000000 8997065836354943000000000000000000000.000000 0.000000
1838658304.000000 -932993472390560320000000000000000.000000 0.000000
0.000000 -1394798159381382800000.000000 0.000000
311109815180258470000000.000000 12363.235352 0.000000

Embarcadero Dえv-C++ 6.2 で確認。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C言語のファイルの読み込みができない

#5

投稿記事 by みけCAT » 3年前

ファイルを読み込む際は、読み込みが成功したかを確認するべきです。

修正前

コード:

    /*  ファイルが終わりでない「かつ」配列を飛び出さないうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < 10000) {
        fscanf(fp, "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]),&(vr[n]),&(vz[n]),&(vphi[n]));
        n++;
    }
修正後

コード:

    /*  ファイルが終わりでない「かつ」配列を飛び出さない「かつ」読み込みに成功するうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < 10000) {
        if (fscanf(fp, "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]),&(vr[n]),&(vz[n]),&(vphi[n])) == 5) {
            n++;
        } else {
            break;
        }
    }
この修正により読み込んでいないのにカウントすることはなくなるので、

コード:

    n = n-1; /* 上のwhileループでは,EOFの行を余分に読み込んでいるので,実際のデータ数は一つ少ない. */
は削除してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

萩お
記事: 12
登録日時: 5年前

Re: C言語のファイルの読み込みができない

#6

投稿記事 by 萩お » 3年前

あたっしゅさん

ご返信ありがとうございます。
あたっしゅ さんが書きました:
3年前
東上☆海美☆「10のべき乗でDを用いるのは Fortran みみ。C/C++ は、e みみ。a.txt の中身の D を e に置換して ae.txt にしたみみ」
C言語では10の累乗としてDは使えないのですね。勉強になります。
テキストデータはFortranを用いて得たものなので、合点が行きました。
読み込む前にデータ自体を変換する必要がありそうですね...

萩お
記事: 12
登録日時: 5年前

Re: C言語のファイルの読み込みができない

#7

投稿記事 by 萩お » 3年前

みけCATさん

ご返信ありがとうございます。
みけCAT さんが書きました:
3年前
ファイルを読み込む際は、読み込みが成功したかを確認するべきです。
おっしゃる通りです。習慣づけていきたいと思います。
また、コードについての修正ありがとうございます。カウントしすぎている可能性があることは、恥ずかしながら意識していませんでした。参考にさせていただきます。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: C言語のファイルの読み込みができない

#8

投稿記事 by あたっしゅ » 3年前

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21077&sid=41e55d811c380cde69da8397c3d5db5b
// C言語のファイルの読み込みができない - ミクプラ(ja)
//
//> テキストデータはFortranを用いて得たものなので、合点が行きました。
//> 読み込む前にデータ自体を変換する必要がありそうですね...
//
//東上☆海美☆「そういう事情なら、C のプログラムの方で、データ変換するみみ。
// あと、float なのに printf で %lf してたので、float を double に直したみみ」
//
#include <stdio.h> 
#include <math.h>


int
main()
{
    int i, j, k, n;
    #define MAX 10000
    //float
	double r[MAX], z[MAX], vr[MAX], vz[MAX], vphi[MAX], E[MAX];    /* 大きめのサイズの配列を用意しておく. */
 
    FILE *fp;
 
    fp = fopen("a.txt", "r");
    //fp = fopen("ae.txt", "r");
    if(fp == NULL) {
        printf("ファイルを開くことが出来ませんでした.\n");

        return -1;
    }
 
    n = 0;

    const int lenMAX = 1024;
    char      buf[ lenMAX ];

    {
    	
		//while(fgetc(fp) != '\n' && !feof(fp)) ; /* 1行目を読み飛ばす */
    	fgets( buf , lenMAX , fp );
    	puts( buf );
    	//while(fgetc(fp) != '\n' && !feof(fp)) ; /* 2行目を読み飛ばす */
    	fgets( buf , lenMAX , fp );
    	puts( buf );
    }
	/*  ファイルが終わりでない「かつ」配列を飛び出さないうちは,読み込みを続ける  */
    while ( ! feof(fp) && n < MAX ) {
    	if( fgets( buf , lenMAX , fp  ) )
        //if( fscanf(fp,  "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]), &(vr[n]), &(vz[n]), &(vphi[n])) 
        {
        	char* ptr = buf;
        	
        	while( *ptr != 0 ) {
        		if( *ptr == 'D') {
        			*ptr = 'e';
				}
        		ptr++;
			}
	    	puts( buf );
			
     	    sscanf( buf,  "%lf %lf %lf %lf %lf\n", &(r[n]), &(z[n]), &(vr[n]), &(vz[n]), &(vphi[n])) ;
	        printf(      "@%lf %lf %lf %lf %lf\n", r[n], z[n],vr[n],vz[n],vphi[n]);
        	n++;
    	} else {
    		break;
		}
    }
    fclose(fp);
 
    //n = n-1; /* 上のwhileループでは,EOFの行を余分に読み込んでいるので,実際のデータ数は一つ少ない. */
 
    /*  計算  */
    for(i=0; i<n; i++) {
        E[i] = (9.11e-31*(vr[i]*vr[i]+vz[i]*vz[i]+vphi[i]*vphi[i]))/(2.0*1.6e-19);
        printf("%lf %lf %lf\n",r[i],z[i],E[i]);
    }
    
    return 0;
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

萩お
記事: 12
登録日時: 5年前

Re: C言語のファイルの読み込みができない

#9

投稿記事 by 萩お » 3年前

あたっしゅさん

ご返信ありがとうございます。ちょうどテキストファイルの変換方法について悩んでいたところでした。プログラムの問題点を指摘していただいただけでなく、テキストファイルの変換方法まで教えていただけるとは、本当に感謝しかありません。

自分の環境でも読み込みと計算結果を表示することができました。本当にありがとうございます。

返信

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