1. ホーム
  2. c

[解決済み] C言語でtxtファイルのデータをスキャンして配列に格納する方法は?

2022-02-07 07:46:26

質問内容

文字列と数値の両方を含むテキストファイルを読み込んで、それぞれの配列に保存しようとしています。読み込もうとしたテキストファイルの内容は次のとおりです。

Ryan, Elizabeth     62
McIntyre, Osborne   84
DuMond, Kristin     18
Larson, Lois        42
Thorpe, Trinity     15
Ruiz, Pedro         35
Ali, Mohammed       60
Vashti, Indura      20

リペアマンの姓、名、年齢を並列配列で保存する必要があります。(だから、読み込むときにカンマを捨てる必要がある)。 これは、私がこれまでに持っているものです。

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

int main(int argc, char *argv[])
{
    char line[100][41];
    char junk[100];
    int i;
    FILE *file = fopen(argv[1], "r");

    if(!file) {
        printf("Could not open file. Exiting application.");
        return 1;
    }

    for(i=0; i<100; i++)
    {
        fscanf(file, "%[^\n]", line[i]); //Get text
        fscanf(file,"%[ \n\t\r]s",junk); //Remove any 'white space' characters
    }

    fclose(file);

    for (i=0; i<30; i++)
        printf("%s\n",line[i]);

    return 0;
}

IDEでfileの引数を渡しました。出力の末尾に特殊文字がたくさん出てくるのですが。

Ryan, Elizabeth         62
McIntyre, Osborne       84
DuMond, Kristin         18
Larson, Lois            42
Thorpe, Trinity         15
Ruiz, Pedro             35
Ali, Mohammed           60
Vashti, Indura          20
┌

 t╠╠

$

M

v
9 Rì
xá

╚

±
t/╗₧8
¿≡`
   Tq töq t4≤`


ÿv
h((((                  Hääääääääääüüüüüüéééééé 

なぜこんなに特殊な文字ばかり読んでいるのだろう?また、カンマを破棄して3つの配列に保存するにはどうしたらよいのでしょうか?

どのように解決するのですか?

何人分のファイルであっても、30人分が出力されるようになっています。あなたの場合、そのファイルには8人しか含まれていませんので、残りの22行で保持されている値( line[8] から line[29] ) は初期化されないので、ゴミ値です。その結果、おかしな文字が出力されます。

以下は、改良したコードです。

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

int main(int argc, char *argv[])
{
    char first[100][40], last[100][40];
    int age[100];
    size_t i = 0;
    FILE *file = fopen(argv[1], "r");

    if(!file) {
        printf("Could not open file. Exiting application.");
        return 1;
    }

    while(fscanf(file, " %[^,],%s%d", first[i], last[i], &age[i]) == 3)
    {
        i++;
    }

    size_t num = i;

    fclose(file);

    for (i = 0; i < num; i++)
        printf("%s, %s\t%d\n", first[i], last[i], age[i]);

    return 0;
}

実は、最初に一行まるごと読み込む必要はない。その代わり、期待されるデータをファイルから直接スキャンしてください。