1

次のような100個のファイル名とそれに対応するサイズのリストを持つ単純なファイルがあります。

file1.txt, 4000
file2.txt, 5000

など.. ファイルを 1 行ずつ読み取り、ファイル名のリストを char 配列に格納し、次にサイズのリストを int 配列に格納するにはどうすればよいですか? このように sscanf を使用しようとしていますが、うまくいきません。私はセグフォルトを取得しています:

main(){
    char line[30];
    char names[100][20];
    int sizes[100];
    FILE *fp;
    fp = fopen("filelist.txt", "rt");
    if(fp == NULL){
        printf("Cannot open filelist.txt\n");
        return;
    }

    while(fgets(line, sizeof(line), fp) != NULL){
        sscanf(line, "%s, %d", names[i][0], sizes[i]);
        printf("%d", sizes[i]);
        i++;
    }
}
4

2 に答える 2

2

iは、読み取り可能なと100の最大数であるを超えることはできません。ファイルに 100 行を超える行がある場合、境界外アクセスが発生します。これを防ぐには、次の (または同様の) 変更を行います。sizesnames

while (i < 100 & fgets(line, sizeof(line), fp) != NULL) {
于 2012-04-29T22:09:03.997 に答える
0
#include <stdio.h>
int main()
{
char line[30];
char names[100][20];
int sizes[100];
int i = 0;
FILE *fp;

fp = fopen("1.txt", "rt");

if(fp == NULL)
{
    printf("cannot open file\n");
    return 0;
}
while(fgets(line, sizeof(line), fp) != NULL)
{
     sscanf(line, "%[^,]", names[i]);//output the string until the char is the ","
     sscanf(line, "%*s%s", sizes);//skip the characters and get the size of the file 
        printf("%s\n", names[i]);
        printf("%s\n", sizes);

    i++;
}
fclose(fp);


return 0;
}

私はこれがあなたが望むものだと思います。

sscanf()を正しく理解する必要があります。

ここに画像の説明を入力してください

于 2012-04-30T04:22:45.900 に答える