忍者ブログ
え?全力で生きているかって? ――答えはYesだ。当たり前だろそれが人生なんだよ!!
[234]  [233]  [232]  [230]  [229]  [228]  [227]  [226]  [225]  [224]  [223
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

正直に言おう。ヒントがほしい!!!



Cプログラミングのレポートでこんな詰み方初めてだ。ガチでわからないwww もうほんとに笑いが出るぐらいにねw




問題はこうだ。

番号と名前と年齢を含む構造体の配列を定義して、ポインタ変数を宣言して、登録人数の分だけ動的にメモリを確保。そしてデータをファイルから入力。ファイルの形式は(ry


結局のところ、

3
1 オレ 14
2 オマエ 43
3 ゆかりん 34

って感じに書いたテキストファイルを用意して、一番上の数字から登録人数を読み込んで、メモリを確保。で、その確保した領域に、番号とか名前とか年齢とかをファイルから読み込んで構造体に入力。最後に表示。こういう流れなんだが・・・。





でだ。オレが書いたプログラムがこうだ。


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

struct person{
    int no;
    char name[20];
    int age;
};


int main(void){
    int n,c;
    struct person *data;
    FILE *fp;

    if((fp=(fopen("data.txt","r")))==NULL){
        printf("Cannot file open!\n");
        exit(EXIT_SUCCESS);
    }

    printf("(ノ´∀`*)テヘヘ♪\n");

    c=getc(fp);

    data=(struct person *)malloc(sizeof(struct person)*(c+2));
    if(data==NULL){
        printf("malloc error!\n");
        exit(EXIT_SUCCESS);
    }
   

    printf("(ノ´∀`*)テヘヘ♪\n");

   
    while(fscanf(fp,"%d %s %d",data->no,data->name,data->age)!=EOF){
        data++;
    }

   
    data[c+2].no=0;
    data[c+2].name[20]=NULL;
    data[c+2].age=0;
   
    printf("(ノ´∀`*)テヘヘ♪\n");
   
    data++;
    while(data->name!=NULL){
        printf("%d %s %d\n",data->no,data->name,data->age);
        data++;
    }


    free(data);
    fclose(fp);

    return 0;
}





printf("(ノ´∀`*)テヘヘ♪\n"); は、プログラムがちゃんと通ってるかを確認するだけのもの。



この状態でプログラムを動かすと、(ノ´∀`*)テヘヘ♪ が2回でる。ということは、メモリの確保まではどうやらできていると判断。つまり、ファイルからデータを取る部分で引っかかってることになる。

これだ。

  
    while(fscanf(fp,"%d %s %d",data->no,data->name,data->age)!=EOF){
        data++;
    }



いや 見た感じ違う気がするなぁってのはなんとなくわかるんだが、どう違うかがさっぱりなのだ。

そもそも、fscanfの動作の仕方がいまひとつわかってない感じ。こいつ使ったらファイルの最後まで読み込んでしまうということでいいんだよな?

さらにもう一つ。構造体に直接代入できるのかって話。\dの引数の部分には&をつけなきゃならんから、本来なら data->no と data->age の部分には先頭に&をつけなきゃならんはずなんだが、つけても動かない。。。

だからと思って、いったん違う変数に代入させてから、構造体に代入していく方向で書いてみたんだが、それでもなんかだめだった。




完璧に詰んだ。はい。



プログラマーの方。もし見たらヒントが欲しいです。今日中にw




20時12分現在、まだまだ奮闘しております。詳細は以下より。



※1時18分現在、解決いたしました~。



20:12


あれからこうなった。ちなみに、ちょっと近づいた様子。

変更した付近だけ載せます。

int main(void){
    int i,c,No,Age;
    char Name[20];
    struct person *data;
    FILE *fp;

   
    ~~略~~


    (data+c+2)->no=0;
    (data+c+2)->name[20]=NULL;   ←上にもってきた
    (data+c+2)->age=0;

    printf("(ノ´∀`*)テヘヘ♪\n");        ←これも増えた

   
    for(data=0;(data+i)->name!=NULL;data++){
        fscanf(fp,"%d %s %d",data->no,data->name,data->age); ←やっぱりこのあたりで止まる
    }
   
   
    printf("(ノ´∀`*)テヘヘ♪\n");
   





20:22



for(data=0;(data+i)->name!=NULL;data++){
        fscanf(fp,"%d %s %d",data->no,data->name,data->age); 
}


の部分がおかしかったから、以下に変更。


for(i=1;(data+i)->name!=NULL;i++){
        fscanf(fp,"%d %s %d",&(data+i)->no,(data+i)->name,&(data+i)->age);
        printf("ok\n");
 }



実行すると、okが無限に表示されるようになった。どうやらループから抜け出せない様子。

・・・どうやら、これの前の

(data+c+2)->name[20]=NULL;

がちゃんとできてないんじゃないかと予想。

・・・くっそぉ。。。




22:54


だいぶきた。うん。


原因はまた違うところにもあった様子。


まず、

c=getc(fp);

が変だったことが判明。この場合だとcには3が代入されてなきゃならんのだが51が出てきた時点でだめだと。

fscanf(fp,"%d",&c);

に変更。というか多分これじゃないとだめっぽい。



さらに、配列の最後に入れてたNULLポインタをやめた。

だから、この部分も、

for(i=1;(data+i)->name!=NULL;i++){
        fscanf(fp,"%d %s %d",&(data+i)->no,(data+i)->name,&(data+i)->age);
        printf("ok\n");
}

から

for(i=1;i<=c;i++){
        fscanf(fp,"%d %s %d",&No,Name,&Age);
        (data+i)->no=No;
        (data+i)->name[20]=Name[20];
        (data+i)->age=Age;
        printf("%d %s %d\n",(data+i)->no,(data+i)->name,(data+i)->age);
        printf("ok\n");
}

に変更。

しかし、どうやらこの配列に代入がしっかりされない様子。どうすりゃいいんだ・・・



そして、Kissyもどうやらこの辺で詰んでるらしい。やっぱりみんなここなんだなぁと。


とりあえず大詰め。ここまできたらやるしかないか。




1:18


え~ 日にちが変わったようですww


ですが、微妙にできてません。。。



しかぁし!!! いいごまかし方を思いついたw だからレポートはこれでいく!!!




最終的にできたプログラムはこちら~


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

struct person{
    int no;
    char *name;
    int age;
};


int main(void){
    int i,c,No,Age;
    char Name[20];
    struct person *data;
    FILE *fp;

    if((fp=(fopen("data.txt","r")))==NULL){
        printf("Cannot file open!\n");
        exit(EXIT_SUCCESS);
    }

//    printf("(ノ´∀`*)テヘヘ♪\n");

    fscanf(fp,"%d",&c);

//    printf("%d\n",c);

    data=(struct person *)malloc(sizeof(struct person)*(c+1));
    if(data==NULL){
        printf("malloc error!\n");
        exit(EXIT_SUCCESS);
    }
   
//    printf("(ノ´∀`*)テヘヘ♪\n");
   
    for(i=1;i<=c;i++){
        fscanf(fp,"%d %s %d",&No,Name,&Age);
        (data+i)->no=No;
        (data+i)->name=Name;
        (data+i)->age=Age;
        printf("%d %s %d\n",(data+i)->no,(data+i)->name,(data+i)->age);
//        printf("ok\n");
    }
   
    free(data);
    fclose(fp);

    return 0;
}
   

free関数の手前の部分に再度構造体を表示させようとすると、3人目の名前ばっかり3つ表示されるようになってしまうが、for文の中に入れてしまうとあら不思議!ちゃんと表示される~~


ということでごまかし成功wwww




以上!長い奮闘はちゃんと解決されましたとさ~☆



もう寝るわwww

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
無題
うーん・・。解決しましたか・・・・。じゃ俺の出番はないね^^
今度、ゆっくり教えますw
MAX 2010/07/01(Thu)14:24:50 編集
無題
マジでヤバくなったら頼りにしてるからよろしくwww
Mugen 2010/07/01(Thu)23:16:59 編集
この記事へのトラックバック
この記事にトラックバックする:
カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
カウンター
プロフィール
HN:
Mugen
性別:
男性
職業:
社会人だよバカヤローー!!
趣味:
ピアノ、アニメ・音楽鑑賞、ネットサーフィンとかとか
自己紹介:
ただの車好きな変態です。

twitterもやってますんで、よければリンクからドゾー
Twitter




最新CM
[01/14 FreddieSpemo]
[01/13 FreddieSpemo]
[01/13 FreddieSpemo]
[12/21 réplique cartier bracelet]
[12/16 van cleef and arpels alhambra diamond necklace knock off]
バーコード
最新TB
ブログ内検索
アクセス解析
忍者ブログ [PR]