0

ファイルから C 配列にスキャンしようとしていますが、エラーが発生します。次のように、各行に数字のみが含まれるファイルを使用していたときにうまくいきました。

1.2  
3.4  
5.2  

しかし、今私はこのファイルを持っています:

0001:Satriani:Joe:6:38.0
0002:Vai:Steve:1:44.5
0003:Morse:Steve:10:50.0
0004:Van Halen:Eddie:3:25.75
0005:Petrucci:John:8:42.25
0006:Beck:Jeff:3:62.0  

これは、配列にスキャンしようとしている方法ですが、セグメンテーション違反が発生します!

FILE *employeesTXT;
int empID[100];
char lastName[100];
char firstName[100];
int payGroup[100];
double hoursWorked[100];

employeesTXT = fopen("employees.txt", "r");
if (employeesTXT == NULL)
{
    printf("Error: file cannot be opened.\n");
} else {
    while (fscanf(employeesTXT, "%[^:]:%[^:]:%[^:]:%d:%lf\n", &empID[i], lastName[i], firstName[i], &payGroup[i], &hoursWorked[i]) != EOF)
    {
        i++;
    }

    fclose(employeesTXT);
    numRecords = i;

    for(i = 0; i < numRecords; i++){
        printf("%d - %s - %s - %d - %.2lf\n", empID[i], lastName[i], firstName[i], payGroup[i], hoursWorked[i]);
    }
}  

それはこの行の何かでなければなりません... %[^:]:%[^:]:%[^:]:%d:%lf\n

4

4 に答える 4

1

文字列の引数パラメータが間違っています:

fscanf(employeesTXT, "%[^:]:%[^:]:%[^:]:%d:%lf\n",
    &empID[i], lastName[i], firstName[i], &payGroup[i], &hoursWorked[i])

lastNameおよびfirstName100 の配列として宣言されていcharます。それらを文字列にしたいので、100個の「バッファ」の配列になるように定義する必要があります。

宣言を次のように変更してみてください。

char lastName[100][50]; /* 50 or whatever the max length you'd expect + 1 */
char firstName[100][50];

私はそれがそのように機能するはずだと信じています。

にも別の問題がempIDあります。値を整数ではなく文字列として読み取っています。%dこれらが実際に入力内の整数である場合、フォーマットでは、整数用である必要があります。

于 2012-04-11T17:17:26.537 に答える
0

指摘したように、名前については、各新入社員の情報を1次元配列に割り当て、それによって前の社員の情報(最初の文字を除く)を上書きします。これにより、配列の終わり近くのインデックスに十分な長さの名前を割り当てようとすると、最終的にエラーが発生し、最後のインデックスが上書きされます。名前に示されているように、2次元配列を使用できます。

char lastname[number_of_employees][maximum_length_of_name];

各lastname[i]はnullで終了する文字列になります。

しかし、これが構造の目的です。

// Define it before main()
struct employee_type{
    int empID;
    char *lastname;
    char *firstname;
    int paygroup;
    double hoursworked;
}

// In main()
struct employee_type employees[100]; // Declare an array of employee_type structures.
于 2012-04-11T17:54:16.073 に答える
-1

のパラメーターとしてアドレスが必要ですfscanf。これは単なる文字であるため、パラメーターとして機能しません。

   lastName[i]
于 2012-04-11T17:17:37.160 に答える