PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   c的程式... (https://www.pcdvd.com.tw/showthread.php?t=253377)

starskgb 2003-10-02 10:53 AM

c的程式...
 
#include<stdio.h>
#include<string.h>
#include<ctype.h>

int xwin();
void insert();
void inarray();
void save();

FILE *cptr;

struct book {
char name[30];
char age[4];
char phone[15];
char email[30];
};
struct book file[100];

char choice, *data, *buf={ "" };
int count=0;

int main( int argc, char *argv[] )

{
if( argc != 2 )
printf( "輸入格式不正確!!!\n" );
else {
if( ( cptr=fopen( argv[1], "r+" ) ) == NULL ) {
cptr=fopen(argv[1],"w");
fclose(cptr);
cptr=fopen(argv[1],"r+");
}
data=argv[1];
inarray();
fclose(cptr);
xwin();
}
return 0;
}

int xwin()
{

printf("(i) insert\n(x) exit\nchoice:");
scanf("\n%c",&choice);
switch (choice)
{
case 'i':
insert();
break;
case 'x':
count--;
save();
break;
default:
printf("沒有這選項!!!\n");
break;
}

return 0;
}

void insert()
{
char c;
printf( "name: " );
scanf( "%s", file[count].name );
printf( "age(1-150): " );
scanf( "%s",file[count].age );
printf( "phone:" );
scanf( "%s", file[count].phone );
printf( "email: " );
scanf( "%s", file[count].email );

while( c != 'n'&&c != 'b'&&c != 'x' )
{
printf( "\n(n)input next (b)back to main (x)exit and save data\nchoice:" );
scanf( "%c", &c );
}
if(c=='n') {
count++;
insert();
}
else
{
if(c=='b')
{
count++;
xwin();
}
else
save();
}

}

void inarray()
{

int x=0;

rewind(cptr);

while (!feof(cptr))
{
fgets( buf, 30, cptr );
sscanf( buf, "name:%s", file[x].name );
fgets( buf, 4, cptr );
sscanf( buf, "age:%s", file[x].age );
fgets( buf, 15, cptr );
sscanf( buf, "phone:%s", file[x].phone );
fgets( buf, 30,cptr );
sscanf( buf, "email:%s", file[x].email );
x++;
}
if(x==0)
count=0;
else
count=x-1;
}

void save() //將所有現有的資料寫入到檔案。
{
int counter=0;

cptr=fopen(data,"w");

while (counter<count)
{
fprintf( cptr, "name:%s\n", file[counter].name);
fprintf( cptr, "age:%s\n", file[counter].age);
fprintf( cptr, "phone:%s\n", file[counter].phone);
fprintf( cptr, "email:%s\n", file[counter].email);
counter++;
}
fclose(cptr);
}

starskgb 2003-10-02 10:56 AM

重點就是...為什麼當我輸入完資料...程式也有開一個檔...但它就是空白的...完全沒有寫入...

ps.這是通訊錄程式...功能簡化過了,就是在dos底下輸入[exe檔名] [要存的檔.txt]
然後就開始跑了...

讀資工真苦...

Lucas Chen 2003-10-02 11:10 AM

用什麼compiler?
有debug工具可以trace變數會比較快知道原因
如果就只是直接compiler compile成binary
那就要把你的程式拆開來try了

讀資工是你自己選的
不要抱怨...

寫程式永遠debug時間大於coding...
以前寫assembly還沒工具可用
一定要用debug看暫存器..

Crazynut 2003-10-02 12:12 PM

學任何程式語言都必須知道Debug的方法,有些可以設定偵錯點,一點一點pause後按鍵繼續(或傳回變數),有些可以使用trace工具。並不是只要學寫就可以了。

substar999 2003-10-02 04:29 PM

引用:
Originally posted by starskgb
重點就是...為什麼當我輸入完資料...程式也有開一個檔...但它就是空白的...完全沒有寫入...

ps.這是通訊錄程式...功能簡化過了,就是在dos底下輸入[exe檔名] [要存的檔.txt]
然後就開始跑了...

讀資工真苦...

樓上的前輩講了那麼多,小弟就來說說樓主程式的問題吧
首先我想問樓主的是
你有試著輸入兩筆不同資料然後儲存嗎?
你是不是會發現只存了第一筆??
其關鍵是,當程式收到要存檔離開時,但前面不是早就輸入一筆資料了..
但你有修改紀錄筆數的變數嗎??
若你能注意到這點...問題便能解決...
另外,你開檔先讀入資料的方式並不是很好...
(這樣你的檔案就只能輸入100筆資料了)
試著以append的方式加入吧...
ps1.對了,你的存檔和讀檔程式部分都有問題....都要修改喔...
ps2.函數本身呼叫函數本身固然可行,但我並不認為你這程式需要用到這種方法
試試看for或while迴圈來改寫吧~~


所有的時間均為GMT +8。 現在的時間是02:41 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2026。