全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1451
推到 Plurk!
推到 Facebook!

我的讀檔程式有問題~

答題得分者是:blk5743
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-07 16:43:51 IP:71.104.xxx.xxx 未訂閱
p5.dat -------------------------------------------------------------- 3211 Smith, Jimmy                 76.0  80.0  85.5  83.0 4321 Adams, Jane                  94.0 100.0  97.5   0.0 1234 Wang,  Andy                  70.5  77.0  85.0  82.0 5678 Johnson,  susan              78.5  66.5  72.0  69.0 9320 Williams,  Donald            72.0  55.0  66.0  45.0 5436 Garcia,  Juan                  84.0  82.0  77.5  91.0 1235 Nguyen,  Vickie              86.0  99.0  88.5  92.0 6324 Jackson,  Janet               80.0  88.0 100.0  88.0 2358 Vargas,  Fernado            72.5  68.0  80.0  70.0 5000 Smith,  Jane                   20.0  75.0  68.0  92.0 1111 Williamson,  David          76.0  50.0  66.0  80.0 5555 Johnson,  Alexander        76.5  70.5  72.0  66.0 3400 Wong,  Suzy                   60.0  60.0  60.0  60.0 9876 Johnson, Doug                99.5 100.0 100.0 100.0 --------------------------------------------------------------- ==================================== 老師要我們做個(file I/O)程式,把p5.dat讀入輸出成以下 Id       Name      Hw    Project   Exam   Final   Percent    Grade ----------------------------------------------------------------------- 3211   Smi...     76.0  ....... . . . . . . . . . 9876  Johns..    99.5....... Average Standard deviation ============================================  
#include 
#include 
typedef struct person 
{
        int id;
        char name[20];
        double hw;
        double project;
        double exam;
        double final;
        int percent;
        char grade;
}person;
int main()
{
        person p;
        FILE *fpIn;
        FILE *fpOut;
        int count
        
        fpIn = fopen("p5.dat", "r");  
        if (!fpIn)
        {
                printf("error opening input file\n");
                exit(1);
        }
        fpOut = fopen("p5out.dat", "w");
        fputs("Id       Name      Hw    Project   Exam   Final   Percent    Grade\n",fpOut);
        fputs("-------------------------------------------------------------------\n",fpOut);
        while ( fscanf(fpIn,sizeof(person),p) != EOF)//有問題 
        {
          fprintf(&p, sizeof(person), 1,fpOut);//有問題             }
         fclose(fpIn);
        fclose(fpOut);
        system("pause");
        return 0;
}      
各位大大我上面的程式就是無法把資料讀寫進去,拜托幫我改感激不盡~還有我不知道我這個程式到底要不要用array,我是打算一次讀入一個人的資料,算出percent跟grade(用A,B,C,D,F表示),最後輸出一人的資料 然後再讀入第二人的資料...算出percent跟grade...如此類推,但因為要各個成績的全班average以及standard deviation,所以我在想需不需要改成array
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-07 17:13:56 IP:210.66.xxx.xxx 未訂閱
1.在你的程式中沒看到讀檔,只看到開檔啊 2.一次讀一個學生資料,分析後存入struct,再存入p5out 3.致於成績,我想不用Array,用累加的並記錄筆數,最後累加值除筆數應就可以了
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-08 07:53:23 IP:71.104.xxx.xxx 未訂閱
引言: 1.在你的程式中沒看到讀檔,只看到開檔啊 2.一次讀一個學生資料,分析後存入struct,再存入p5out
有阿我有做讀檔阿~在int count的下面~(一次讀一個學生資料,分析後存入struct,再存入p5out)~還有我知道我讀取的寫法寫錯,要如何改呢?
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-08 09:47:55 IP:71.104.xxx.xxx 未訂閱
這是我改寫的code但他的output還是怪怪的  
#include 
#include 
typedef struct person 
{
        int id;
        char name[20];
        double hw;
        double project;
        double exam;
        double final;
        double percent;
        char grade;
}person;
int main()
{
        person p;
        FILE *fpIn;
        FILE *fpOut;
        int count;
        
        fpIn = fopen("p5.dat", "r");  
        if (!fpIn)
        {
                printf("error opening input file\n");
                exit(1);
        }
        fpOut = fopen("p5out.dat", "w");
        fputs("Id       Name                  Hw    Project   Exam   Final   Percent    Grade\n",fpOut);
        fputs("-------------------------------------------------------------------\n",fpOut);
        while ( fread(&p, sizeof(p),1,fpIn)!=NULL ) 
        {
             fwrite(&p, sizeof(p),1,fpOut);            }
         fclose(fpIn);
        fclose(fpOut);
        system("pause");
        return 0;
}      
output: Id Name Hw Project Exam Final Percent Grade ------------------------------------------------------------------- 3211 Smith, Jimmy 76.0 80.0 85.5 83.0 4321 Adams, Jane 94.0 100.0 97.5 0.0 1234 Wang, Andy 70.5 77.0 85.0 82.0 5678 Johnson, susan 78.5 66.5 72.0 69.0 9320 Williams, Donald 72.0 55.0 66.0 45.0 5436 Garcia, Juan 84.0 82.0 77.5 91.0 1235 Nguyen, Vickie 86.0 99.0 88.5 92.0 6324 Jackson, Janet 80.0 88.0 100.0 88.0 2358 Vargas, Fernado 72.5 68.0 80.0 70.0 5000 Smith, Jane 20.0 75.0 68.0 92.0 1111 Williamson, David 76.0 50.0 66.0 80.0 5555 Johnson, Alexander 76.5 70.5 72.0 66.0 3400 Wong, Suzy 60.0 60.0 60.0 60.0 9876 Johnson, Doug 99.5 100.0 100.0 //這裡不見了
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-08 13:13:48 IP:219.81.xxx.xxx 未訂閱
引言: while ( fread(&p, sizeof(p),1,fpIn)!=NULL ) { fwrite(&p, sizeof(p),1,fpOut); }
上面的部分有問題 我幫你改成下面的CODE 因為是你的作業,所以我沒有把整題做完 剩下的交給你自己了
 
#pragma hdrstop
#include 
#include 
#include 
typedef struct person
{
        int id;
        char name[20];
        double hw;
        double project;
        double exam;
        double final;
        double percent;
        char grade;
}person;    //---------------------------------------------------------------------------    #pragma argsused
int main(int argc, char* argv[])
{            person p[20];
        FILE *fpIn;
        FILE *fpOut;
        int count = 0;
        char msg[80],*token;
        int Para = 0;            fpIn = fopen("p5.dat", "r");  
        if (!fpIn)
        {
                printf("error opening input file\n");
                exit(1);
        }
        fpOut = fopen("p5out.dat", "w");
        fputs("Id       Name                  Hw    Project   Exam   Final   Percent    Grade\n",fpOut);
        fputs("-------------------------------------------------------------------\n",fpOut);
        while ( fgets(msg, sizeof(msg),fpIn)!=NULL )
        {
            fputs(msg,fpOut);
            token = strtok(msg," ");
            p[count].id = atoi(token);
            if ( (token = strtok(NULL," ")) != NULL); //引號內填入你要用來區隔的字元" "
                strcpy(p[count].name,token);
            if ( (token = strtok(NULL," ")) != NULL ); 
            {
                strcat(p[count].name," ");
                strcat(p[count].name,token);
            }
            if ( (token = strtok(NULL," ")) != NULL );                 p[count].hw = atof(token);
            if ( (token = strtok(NULL," ")) != NULL );                 p[count].project = atof(token);
            if ( (token = strtok(NULL," ")) != NULL );                 p[count].exam = atof(token);
            if ( (token = strtok(NULL," ")) != NULL ); 
                p[count].final = atof(token);
            count  ;
        }
         fclose(fpIn);
        fclose(fpOut);
        system("pause");
        return 0;
}
//---------------------------------------------------------------------------
 
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-08 14:45:22 IP:71.104.xxx.xxx 未訂閱
blk5743 你好~ 感謝你的幫忙~我有幾個問題想問你~ atoi(token); atof(token); strtok 我完全沒學過他們的用法,你能解釋給我聽嗎?謝謝~ 還有我要算percent是不是這樣算 p[count].percent=(p[count].hw p[count].project p[count].exam p[count].final)/4; if ( (token = strtok(NULL," ")) != NULL ); p[count].percent = atof(token); ~還有我必須算出各科成績的全班總平均,所以我必須知道有幾個學生,也就是幾個欄位,欄位的算法是不是 byteinfile=ftell(fpIn) records=byteinfile/sizeof(p) records就是幾個學生吧~???
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-08 16:05:35 IP:71.104.xxx.xxx 未訂閱
blk5743 你好~ 有沒有除了用strtok以外的方法呢? 因為你給的寫法已超過我的程度了~能否在fputs(msg,fpOut);後用if以及fprintf來設定呢?
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-09 08:54:37 IP:61.66.xxx.xxx 未訂閱
引言: atoi(token); atof(token); strtok 還有我要算percent是不是這樣算 p[count].percent=(p[count].hw p[count].project p[count].exam p[count].final)/4; if ( (token = strtok(NULL," ")) != NULL ); p[count].percent = atof(token); ~還有我必須算出各科成績的全班總平均,所以我必須知道有幾個學生,也就是幾個欄位,欄位的算法是不是
tai1688你好: 你說不了解這些函式的意思,超過你的程度?? 我想那這樣你應該高興才對,因為你又學到新東西了 先跟你解釋一下atoi,atof,這就是字串轉整數及浮點數 strtok是將字串拆解的函式 這些函式你的可以在你的編譯器中的help找到 或是你可以在網路上找也行, 我想,你的國別是寫USA,看英文應該是沒問題吧 至於要算個人平均,當然是用個人總分(各科加起來)除以科目數(這是國小的問題吧) 全班平均,也是同樣的意思 至於有多少的同學,不就是count值嗎?? 我想我給你的範例,並不是非常難 只是你有幾個點不清楚而已,自己查一下,對你有幫助 要不然等以後工作時,有誰能幫你
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-09 10:54:40 IP:71.104.xxx.xxx 未訂閱
blk5743 你好~ 我是在美國讀大學的學生,美國人的教法就是交個大概其他靠自己~我是很高興我又學到了新東西~但我們老師既然沒交strtok就要我們做,那就表示有其他的切割字串,分別依序放入 struct的方法,不知道有嗎?感謝你的教導~Thx~
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-09 11:59:59 IP:61.66.xxx.xxx 未訂閱
引言: 我是在美國讀大學的學生,美國人的教法就是交個大概其他靠自己~我是很高興我又學到了新東西~但我們老師既然沒交strtok就要我們做,那就表示有其他的切割字串,分別依序放入 struct的方法,不知道有嗎?感謝你的教導~Thx~
tai1688你好: 我不知道的老師教了什麼給你,所以切割字串有很多種方式 有用函式,有土法煉鋼,我不知道該告訴你哪一種 不過,如果你的老師並沒有限定要哪一種的話 那就應該都可以吧 要不然你就用最基礎的方式 把字串(或字元)讀進來,每讀到一個空白就當作一個字串 再把字串存入你相對應的結構欄位中 我最後還是要說一句話 這是作業,所以要自己想,我只能提供方法,不能幫你做 既然是老師教的,那老師之前的教學中一定有線索可以做 要怎麼找,找到後該怎麼做,就是你的工作了 你去上學,為的不也是學到這些嗎 難道要等老師告訴你該怎麼做,給你答案嗎 上大學了,就是要培養思考能力 而不是之前填鴨式(培養基本技能)的學習模式了
tai1688
一般會員


發表:9
回覆:12
積分:4
註冊:2005-03-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-09 12:27:50 IP:71.104.xxx.xxx 未訂閱
blk5743 你好~ 你教訓的是~老師可能就是要我用你講的方法(把字串(或字元)讀進來,每讀到一個空白就當作一個字串,再把字串存入你相對應的結構欄位中) 我也就打算改用這種方法~謝謝你的教導~
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-09 15:24:46 IP:61.66.xxx.xxx 未訂閱
tail688你好: 大家來這網站,就是希望教學相長 不過在這邊,希望學的是方法,而不是對某依單一個問題做解答 如果你需要特殊的解法(通常是作業,或是因為特殊關係被限制) 請事先提出來,這樣別人才知道你的需求 你打算用最基礎的方法做(或許這才是你們老師希望的答案),當然可以 不過希望你也能研究我提供的另外一個方法(strtok) 多會幾種方法是不吃虧的,畢竟老師也不可能教你所有的方法 最後我想說,加油吧,多在網站上學習很多自己不知道的技巧 大家一起努力增強寫程式的功力
系統時間:2024-11-23 18:26:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!