2012-03-31 16 views
0

私は、この文字列の各部分がそれぞれの値を持つことになりますので、このファイルからデータを取得したい情報にCでファイルからデータを読み取る方法は?

0001:Jack:Jeremy:6:38.0 
0002:Mat:Steve:1:44.5 
0003:Jessy:Rans:10:50.0 
0004:Van Red:Jimmy:3:25.75 
0005:Peter:John:8:42.25 
0006:Mat:Jeff:3:62.0 

を含むファイルを持っています。 たとえば、double numは3になります。 char firstn[20]は「ジャック」、char lastn[20]は「ジェレミー」、int tは6、double hourは38.0となります。

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

int main() 
{ 
    FILE *read, *write; 
    int i, group; 
    double hours, num; 
    char lastn[20], 
     firstn[20]; 

    read = fopen("people.txt", "r"); 
    if (read == NULL) { 
     printf("Error, Can not open the file\n"); 
     exit(0); 
    } 
    write = fopen("people.dat", "w"); 
    for (i=0; i<6; i++) { 
     fscanf(read, "%lf:%s:%s:%d:%lf", &num, lastn, firstn, &group, &hours); 
     fprintf(write, "Number: %lf Fname: %s Lastn: %s Group: %d Hours: %.1lf\n", num, lastn, firstn, group, hours); 
    } 
    fclose(read); 
    fclose(write); 

    return 0; 
} 

私はそうしようとしています、私の文字列lastnは、行の最後まで、すべての情報を取ります。

どのように指定することができますか?firstn:まで文字を取り、lastnの文字列はJeremyのみになり、グループには6だけかかるなどです。

+0

ええ、その大きな割り当てが、私はすべてのアイデアを持っていますが、他に何かをする方法がありますが、変数をスタックするだけです。 –

+0

宿題に「宿題」とタグを付けてください –

+0

申し訳ありませんが、それを知らなかった、今すぐ修正します。 –

答えて

2

fscanf()フォーマット文字列を変更することができます。

if (fscanf(read, "%lf:%19[^:]:%19[^:]:%d:%lf", &num, lastn, firstn, &group, &hours) != 5) 
    ...the read failed... 

表記%19[^:]手段がヌルに続く文字列に、「19非結腸文字まで読み取ります」。変数lastnfirstnchar[20]です。変換がチェックされていることに注意してください。あなたが5以外の答えを得ると、何かが間違っていました。あなたはfscanf()コールの後に改行までの行の残りの部分をスキャンし検討するかもしれない:

int c; 
while ((c = getc(read)) != EOF && c != '\n') 
    ; 

また、あなたは、出力ファイルを開くことに成功したことを確認する必要があります。

+0

それは私が探していた答えでした!ありがとうございました !とてもとても! –

+0

あなたはfscanfをそのように使うことができないことを知りませんでした。驚くばかり! – NTDLS

1

使用fgets()好きなように今、あなたは変数にトークンを保存することができますラインを読み、strtok()

char line[100]; 
char *p; 

fgets(line); 
p = strtok(line, ":"); 

を使用して、それをトークン化します。

+0

他のアイデアはありがたいですか? –

+0

この回答には何がありますか? –

+0

@Stanleyデリミタとして「:」があるためこれはそれをトークン化する良い方法です。普通の%sは空白をセパレータとして必要とします。 –

1

試してみてください。

fscanf(read, "%lf:%[^:]:%[^:]:%d:%lf", &num, lastn, firstn, &group, &hours); 

%[^:]手段は、コロンを含まない文字列を読み込みます。 scanfを参照してください。

+0

ありがとう!!!!! –

関連する問題