8

次の形式の名前を含む txt ファイルを解析しようとしています。

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH",...

これは私が書いたコードです:


#include <stdio.h>
// Names scores
int problem22() {
    FILE *f = fopen("names.txt", "r");
    char name[100];
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // MARY
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // ,
    fscanf(f, "\"%[^\"]s", name);
    printf("%s\n", name); // PATRICIA
    return 0;
}

int main() {
    problem22();
    return 0;
}

を交互に呼び出すたびfscanfに名前が付けられますが、もう一方はコンマを取得するのに無駄になっています。いくつかのフォーマットを試しましたが、どうすればよいかわかりません。

誰でも正しい形式で私を助けることができますか?

4

4 に答える 4

3

私は常にstrtok()orstrtok_r()関数を使用してファイルを解析するのが好きです。(いずれかのcsvライブラリを使用することを好みます)。

しかし、楽しみのためにコードを書いたので、あなたが好きかもしれません。回答にコードを投稿していませんが、@ codepadで出力を確認してください。特定の形式でのみ機能します。

strtok() の使用

私には正しいアプローチは次のようになります。

int main(){
// while(fp, csv, sizeof(csv)){   
    // First read into a part of file  into buffer
    char csv[] = "\"MARY\",\"PATRICIA\",\"LINDA\",\"BARBARA\",\"ELIZABETH\"";
    char *name = "", 
       *parse = csv;
    while(name = strtok(parse, "\",")){
        printf(" %s\n", name);
        parse = NULL;
    }
    return 0;
} // end while 

出力のコードパッドを確認します。

 MARY
 PATRICIA
 LINDA
 BARBARA
 ELIZABETH

2番目のコードで提案するのは、外側のループを描画してファイルから一時バッファーに行を読み取り、上記のような strtok() コードを次のように適用することです。 while(fgets(fp, csv, sizeof(csv))){ use strtok code}

于 2013-10-11T06:50:30.993 に答える
3

入力フォーマット文字列を次のように変更すると、"%*[,\"]%[^\"]"必要なことが行われます。

fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // MARY
fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // PATRICIA
fscanf(f, "%*[,\"]%[^\"]", name);
printf("%s\n", name); // LINDA

%*一致する入力をスキップするだけです。

于 2013-10-11T06:51:45.703 に答える
2

fseek()を使用する必要があります。

このコードは正常に動作します:

#include <stdio.h>
#include <string.h>

int problem22()
{
    FILE *f = fopen("names.txt", "r");
    char name[100];
    int pos = 0, maxnames = 4, n;

    for(n = 0; n <= maxnames; n++)
    {
        fseek(f, pos, 0);
        fscanf(f, "\"%[^\"]s", name);
        printf("%s\n", name);
        pos += (strlen(name) + 3);
    }
    return 0;
}

int main()
{
    problem22();
    return 0;
}
于 2013-10-11T06:41:09.487 に答える
1

strtok() 行全体を読み取り、 delin 文字列でトークンに分割できます","

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

// Names scores
int problem22() {
    FILE *f = fopen("file", "r");
    char *tok=NULL;
    char name[100];
    fscanf(f,"%s",name);

    printf("string before strtok(): %s\n", name);
    tok =  strtok(name, ",");
    while (tok) {
        printf("Token: %s\n", tok);
        tok = strtok(NULL, ",");
    }


return 0;
}

int main() {
    problem22();
    return 0;
}

注:strtok()関数は解析中に静的バッファーを使用するため、スレッドセーフではありません。これが重要な場合に使用strtok_r()します。

見るman strtok_r

于 2013-10-11T06:32:49.347 に答える