1

ファイルからデータを読み取り、これまでのすべての列と行 (データ ファイル) を取得しています。今、値を 1 つずつ読み取り、値を 2D 配列 (double) に格納しようとしています。getc を使用して値を char として取得しますが、atoi または atof を使用して値を char から double に変換しようとすると、奇妙な値が得られます。

double ther[j][number];
char c;
int tim=0,nther=0;


FILE *fp3 = fopen("data.txt", "r");
c = getc(fp3) ;

while (c!= EOF)
{ 

    ther[tim][nther]=atoi(&c);
    printf("%lf", ther[tim][nther]);


    nther++;
    c = getc(fp3);

    if(nther==number)
    {
        tim++;
        nther=0;
    }
    tim=0;
}

fclose(fp3);

何か提案はありますか?… (私は探し続けます)。申し訳ありませんが、ファイル data.txt があり、このファイルには行と数字の列があります:

1 2 3 4 5

6 7 8 9 10

したがって、データを 2D 配列に格納する必要があります。回答のおかげで、文字列を使用し、すべての値を分割して、すべての値を格納するなどのアイデアがあります。1 行目は string-> array[0][0]、array[0][1] などです。次に、他の行に移動して同じことを行います。

今までいくつかの数値を取得しましたが、data.txt に格納されているものはありません。

4

3 に答える 3

1

fscanfを使用して、ファイルから double を読み取ることができます。例は次のとおりです。

double d;
fscanf("%f", &d);

fscanf はそれ以上のことができるので、ドキュメントを確認することをお勧めします。

あなたが使用しているメソッドは、単一の文字を取得します(Matt McNabbが指摘したように-間違っています)。文字は 1 バイトで、0 ~ 255 の値を格納できます。fopen でモードを指定していないため、テキスト モードで読んでいます (通常、バイナリの "rb/wb" モードまたはテキストの "rt/wt" モードを明示的に要求することをお勧めします)。これは、1 桁のASCII 値を読み取ることを意味します。

ファイルに次のものが含まれているとします。

7.2, 3.0, 1.0

への最初の呼び出しは、ASCII の値 55 を持つ文字'7' をgetc(fp3)取得します。明らかに、これはあなたが探しているものを提供するつもりはありません。

代わりに、次を使用できます。

double d[3];
fscanf("%f, %f, %f" &d[0], &d[1], &d[2]);

ファイル内の 3 つの float 値を取得します。

于 2014-03-28T04:50:28.763 に答える
1

まず、それはあるべきですint c;。このgetc()関数は、考えられるすべての s に対して異なる値を返すことができなければならずchar、また異なる値EOF(ファイルの終わりまたはストリーム エラーを意味する) も返さなければなりません。

を使用する場合はchar c;、最終EOF的に有効な文字の値に変換される必要があるため、2 つのケースの違いを見分けることはできません。言い換えれば、EOF実際には特定の文字にヒットしただけなのに、コードがヒットしたように振る舞う可能性があります。

先に進むのatoi(&c)は正しくありません。関数のドキュメントを読むと (これは、関数を使用する場合は常に良い考えです)、入力として文字列atoiが必要であることがわかります。ただし、文字列ではありません。1 文字のアドレスです。&c

したがって、オプションは次のとおりです。

  • 文字列を作成して渡すatoi
  • 使用しないでくださいatoi

あなたは自分が期待していたことを言いませんでした。'3'しかし、読み込んだ文字を整数に変換したい場合は、次のように3書くことができますther[tim][nther] = c - '0';

ただし、数値ではないものを読み取った場合のケースを処理するコードも必要です。

一度に複数の文字を読みたい場合 (例: "31"-> 31)、使用するアプローチは適切ではありません。 orgetcなど、一度に複数の文字を読み取る関数の使用に切り替える必要があります。fscanffgets

最後に、ループの繰り返しごとに設定timするため、永続的な効果はありません。おそらくこれは見落としでした。0tim++

于 2014-03-28T04:55:22.293 に答える
0
#include <stdio.h>

int main(){
    int j = 2;
    int number = 5;

    double ther[j][number];
    double d;
    int tim=0,nther=0;
    FILE *fp3 = fopen("data.txt", "r");

    while (fscanf(fp3, "%lf", &d)==1){
        ther[tim][nther]=d;
        printf("%g ", ther[tim][nther++]);

        if(nther==number){
            ++tim;
            nther=0;
            printf("\n");
        }
    }
{
    int r, c;
    for(r=0;r<tim;++r){
        for(c=0;c<number;++c){
            printf("%f ", ther[r][c]);
        }
        printf("\n");
    }
}
    return 0;
}
于 2014-03-28T08:35:49.767 に答える