iT邦幫忙

0

C/C++ 通訊錄小程式問題求解

#include <stdio.h>
#include <string.h>
​
struct Book
{
    char Name[50];
    char Phone[50];
    char Email[50];
};
int main()
{
    struct Book b[100];
    int n = 0,i;
    FILE  *in;
    FILE  *out;
    char str[50];
    char op;
    while(1){
        puts("i 輸入");
        puts("l 列印");
        puts("s 存檔");
        puts("o 讀檔");
        //puts("c 清除");
        puts("q 離開");
        printf("> ");       
        scanf(" %c", &op);
        switch(op){
            case 'i':
                puts("輸入......");
                puts("姓名:");
                scanf("%s",b[n].Name);
                puts("電話:");
                scanf("%s",b[n].Phone);
                puts("Email:");
                scanf("%s",b[n].Email);
                n++;
                printf("插入完成!\n");
                break;
            case 'l':
                puts("列印......");
                for(i=0;i<n;i++){
                    printf("No.%d:\n", i+1);
                    printf("Name: %s\n",b[i].Name);
                    printf("Phone: %s\n",b[i].Phone);
                    printf("Email: %s\n\n",b[i].Email);
                }
                break;
            case 's':               
                puts("請輸入(.txt)");              
                scanf("%s",&str);
                out = fopen(str,"w");
                for(i=0;i<n;i++){
                    fprintf(out, "%d\n",i+1);
                    fprintf(out, "%s\t",&b[i].Name);
                    fprintf(out, "%s\t",&b[i].Phone);
                    fprintf(out, "%s\n\n",&b[i].Email);
                }
                fclose(out);
                break;
            case 'o':
                
                do{
                    n=0;
                    puts("請輸入(.txt)");
                    scanf("%s",&str);
                    in = fopen(str,"r");
                    fscanf(in, "%d\n",&n);
                }while(in==NULL);
                    for(i=0;i<n;i++)
                        fscanf(in,"%s %s %s\n",&b[i].Name,b[i].Phone,b[i].Email);       
                fclose(in);
                for(i=0;i<n;i++){
                    printf("No.%d:\n", i+1);
                    printf("Name: %s\n",b[i].Name);
                    printf("Phone: %s\n",b[i].Phone);
                    printf("Email: %s\n\n",b[i].Email);
                }
                break;
            //case 'c':
            //   
            //  break;
            case 'q':
                return 0;
                break;          
        }       
        system("pause");
        system("cls");
    }
    return 0;
    }
想請問各位先進,最近目前在學C/C++

目前卡關在"c 清除"和"o 讀檔",清檔部分目前不太知道怎麼下手外,而讀檔則是卡在都只能讀到No.1的資料

儘管.txt檔有其它資料依然只能讀到No.1的字串部分。

希望有人能指點迷津...謝謝

這邊回答weiclin:是
但問問題跟作業的相關性是!?

抱歉,剛看iT這邊顯示我是"新手階段"無法做回應

weiclin iT邦高手 4 級 ‧ 2018-06-01 15:09:24 檢舉
你先誠實回答是不是作業

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2018-06-01 15:57:46
最佳解答

讀檔的部份是因為
你「讀第一列的數字做為資料筆數」(n)
而在你存檔的時侯
你第一列的數字是 1 (在這裡應該是第1筆的意思)
所以你不管有多少資料
永遠都只會讀到第一筆就結束

你可以看一下你存的檔案
會比較有想法

一般讀檔是以 EOF 做為結束
而不會用「筆數」做判斷
寫起來也沒有幾列
參考一
參考二

我要發表回答

立即登入回答