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

如何判斷讀取 txt 檔到陣列的型態

尚未結案
w40192
一般會員


發表:1
回覆:2
積分:0
註冊:2005-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-11 11:16:00 IP:61.58.xxx.xxx 未訂閱
底下是我修改 c 語言書的程式:(使用有經過buffer的開檔方法) 把原本已給值的A[]={7,1,2,3,4}陣列,改成元素值是存在 data.txt 檔來讀入. 我先用 fread 來讀入txt檔裡頭的7 1 2 3 4,然後應該會一個字元一個字元丟 入 ch 的變數中,最後列印出A[ch]的元素!? 現在問題來了,在程式後半段的地方,我是自己判斷for迴圈對已讀入到陣列A[i] 中,是一個整數加一個空白,此時我的程式可以正常的印出陣列值和 比較出大小值.(我也對字元 - 48 讓後半斷的程式變成輸出會是整數) 1.若假設說我的7 1 2 3 4,並非是個位數,而是有參雜2位數或更多位數的話ex: (1000 100 20 200 2),程式應該是會出現亂碼,我該怎麼去解決讀入到A[]陣列 的元素呢? 2.如果我的txt檔裡面存了文字,加整數,又有空格時,如果我只想抓txt檔的整數 部份,我又該如何去對從txt檔抓進來的A[ch]做判斷呢?(這問題如果能回答的話 不用整個程式,我知道大概的方法就行了)
 
/* prog9_5, 比較陣列元素值的大小 */
#include 
#include 
#define MAX 80
int main(void)
{       FILE *fptr;
   char A[MAX];
   int ch,num;                         /* 存放fread()成功讀取的字元數 */
   fptr=fopen("data.txt","r");
                
   while(!feof(fptr))                /* 如果還沒讀到檔尾  */
   {
      ch=fread(A,sizeof(char),MAX,fptr);
      if(chmax)         /* 判斷A[i]是否大於max */
         max=A[i];        
      if(A[i]
這邊的圖是輸出和txt檔放置的情形:
    先感謝肯為此文章花時間解決的朋友們!?    發表人 - w40192 於 2005/06/11  11:22:44    發表人 - w40192 於 2005/06/11  11:24:07
        
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-11 19:41:35 IP:219.136.xxx.xxx 未訂閱
w40192 您好:    我試著將您的程式修改了一下,結果大致可以達到您所要的動作,我使用的方式是拆解讀入的字元資料,過濾掉非數字字元,然後再將數字字元換算後重新組合起來,同時我也另設了一組陣列來存放取得的數字資料。    我並未對程式做最佳化處理,而是儘量保留了您原來的敘述,並且是以達到拆解數字資料的目的為主,其它諸如陣列大小....等等的,都是隨意設定的,拆解對象也不包含小數點或是逗號在內,但是主要的拆解部份,我都加註了說明,您參考看看吧:
#include 
#include 
#define MAX 80    int main(void)
{
    int i, min, max;
    FILE *fptr;
    char A[MAX];
    int ch, num;
    int cnt;   /* 累加與紀錄數字的組數 */
    int base;  /* 換算數字的基底 */
    int isNum; /* 檢查是否為數字字元的旗號 (1=是數字字元, 0=不是數字字元) */
    int digit[MAX]; /* 存放轉換後數字的陣列 */        fptr = fopen("data.txt", "r");
    fseek(fptr, SEEK_SET, 0);
    ch = fread(A, sizeof(char), MAX, fptr);
    fclose(fptr);        A[ch] = '\0';
    printf("讀取字元數:%d\n讀取內容:%2s \n", ch, A);        cnt = -1;  /* 設定初值為沒有拆解到數字組 */
    isNum = 0; /* 設定初值為不是數字字元狀態 */
    printf("拆解過程:\n");
    for(i=0; i= 0x30 && A[i] <= 0x39){ /* 若字元是 '0'~'9' 的數字字元*/
            if(isNum == 0){  /* 如果是每次拆解數字字元的第一個字元 (例如 1024 的 1) */
                cnt  ;  /* 累加數字組數量 */
                base = 1;  /* 基底為個位數 */
                digit[cnt] = 0;  /* 設定這一組數字陣列的初值為 0 */
            }else{  /* 如果是每次拆解數字字元的第二個或是之後的字元 (例如 1024 的 024) */
                base = 10;  /* 基底為現有位數乘以十 */
            }
            num = A[i]-0x30;  /* 轉換字元碼為數字 */
            digit[cnt] = (digit[cnt] * base)   num;  /* 原有數字乘上基底後再加上現有數字 */
            isNum = 1;  /* 讀取的字元是數字字元,若下個字元亦為數字則基底設為 10 */
        }else{
            if(isNum == 1){
                if(cnt == 0){  /* 如果是第一組數字,則設為 min 與 max 的初值 */
                    min = max = digit[cnt];
                }else{
                    if(digit[cnt] > max){
                        max = digit[cnt];
                    }else if(digit[cnt] < min){
                        min = digit[cnt];
                    }
                }
                printf("%d\n", digit[cnt]);
            }
            isNum = 0;  /* 重設為不是數字字元的檢查旗號 */
        }
    }        printf("\n共有 %d 個元素\n", cnt 1);
    printf("陣列裡元素的最大值為 %d\n", max);
    printf("陣列裡元素的最小值為 %d\n", min);        system("pause");        return 0;
}
w40192
一般會員


發表:1
回覆:2
積分:0
註冊:2005-05-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-12 11:12:39 IP:61.58.xxx.xxx 未訂閱
ReadSnow大哥您好: 關您回覆的程式,我已經知道它的動作流程了! 可是我在編譯的時候出現圖中這個問題: 這個問題好像已經超出我所學的範圍,能煩請您幫我解釋這是關於什麼樣的錯誤 好嗎? 還有,這是不是關於程式中有一行 fseek(fptr, SEEK_SET, 0); 所出現的問題呢?因為我只有這一行不曉得他的動作是怎樣的!?如果他們是同一 個問題的徵結應該就離成功編譯不遠了吧!? 先感謝您再次的幫忙!?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-12 20:55:57 IP:218.19.xxx.xxx 未訂閱
w40192 您好:    有關您詢問的那個動作 fseek(fptr, SEEK_SET, 0);,那只是將位置指向檔案開頭而已,以您現在的流程來看,該行敘述寫不寫應該都沒有太大的關係,您將它刪除掉好了,祝您順利。
w40192
一般會員


發表:1
回覆:2
積分:0
註冊:2005-05-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-12 23:32:17 IP:61.58.xxx.xxx 未訂閱
ReadSnow 大哥您好: 關於我上一封提到的 fseek 的問題,確定沒有錯誤,是我自己忘了把 data.txt 檔給拉到同一個資料夾下,因此造成編譯正確,執行有錯誤!? 至於您說的fseek 在您改善的程式裡面程式執行時應該是可有可無,我有把它刪 除再執行和存在再執行都可得到正確的答案!? 值得一提的是,您在搜尋數字時,令我想起當初在做回文數時的做法,一樣都是利 用一個count和一個基數base來做處理!!!我想,寫程式的功夫上,還是會以資歷 取勝的吧,工具上的使用還是得靠熟能生巧呢!? 再次感謝您的指導!? 謝謝!?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-13 11:42:51 IP:219.137.xxx.xxx 未訂閱
w40192 您好: 您說得沒錯,寫程式與經驗還是有很大的關係,工具的使用也是熟能生巧,我是跌跌撞撞走過來的,每碰到一次難題並將它解決之後,就學到一些新事物,並且轉化為自己的經驗,這些經驗有很多是前人所提供的,這裡有許多的先進們都很願意將自己的寶貴經驗提供出來,因此在參予討論的過程中,會學習到一個問題的不同解法,長久以往就會學到更多以前所沒想到的解決方式,我也因此受益匪淺,所以我願意向他們學習,相信您積累了一些經驗之後也會一樣的,祝您順心~
系統時間:2024-04-20 21:38:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!