如題,現在小魚在正在製作這兩的功能。
小魚的想法如下:
先用fseek把檔案指標移到要變更的那行
在用fprintf蓋上去...
可是實際上指標老是對不準...
請問要怎樣達成這種效果呢?
2006-12-29 11:29:17 · 2 個解答 · 發問者 鵬帆 2 in 電腦與網際網路 ➔ 程式設計
以下是新增檔案的部分,跑的很成功:
new_datas=new_data();/*取得新增資料*/
printf("\n\n你確定要新增資料嗎?[Y/N]:");
scanf("%c%c",&mind,&w_of_NL);
2006-12-29 11:31:27 · update #1
if(mind=='Y'||mind=='y'){
fseek(input,0*sizeof(data_t),SEEK_END);/*把指標移向檔案最後方*/
fprintf(input,"\n%-8s%-20s%-15s%-19s%-20s%-5d%-6d%-5d%-6d",
2006-12-29 11:31:43 · update #2
new_datas.plane_number,
new_datas.St_city,
new_datas.Ar_city,
new_datas.St_time,
new_datas.Ar_time,
new_datas.FCC_odd,
new_datas.FCC_sale,
new_datas.TCC_odd,
new_datas.TCC_sale);
}/*寫入檔案*/
printf("\n資料已新增。\n\n");
2006-12-29 11:31:47 · update #3
以下是問題部分:
NM=1;
printf("請輸入航機號碼:");
scanf("%s%c",user_data.plane_number,&w_of_NL);
for(i=1;i<=da_inp;i ){
2006-12-29 11:32:39 · update #4
if(strcmp(user_data.plane_number,all_datas[i].plane_number)==0)
2006-12-29 11:32:54 · update #5
{print_data(all_datas[i]);
printf("\n\n你確定要刪除資料嗎?[Y/N]:");
scanf("%c%c",&mind,&w_of_NL);
2006-12-29 11:32:59 · update #6
if(mind=='Y'||mind=='y'){
fseek(input,i*sizeof(data_t),SEEK_SET);
fprintf(input,"%-8s%-20s%-15s%-19s%-20s%-5d%-6d%-5d%-6d",
2006-12-29 11:34:11 · update #7
delete_data.plane_number,
delete_data.St_city,
delete_data.Ar_city,
delete_data.St_time,
2006-12-29 11:34:19 · update #8
delete_data.Ar_time,
delete_data.FCC_odd,
delete_data.FCC_sale,
delete_data.TCC_odd,
delete_data.TCC_sale);}
NM=0;}}
if(NM==1)
printf("\n不好意思,找不到檔案。\n");
2006-12-29 11:34:23 · update #9
以下為檔案資料節錄:
AE_812 Taoyuan Airport MMB 2006/12/21_06:25 2006/12/22_05:35 29 195 24 83
CX_463 Taoyuan Airport Hong Kong 2006/12/21_07:00 2006/12/22_06:25 21 155 1 3
2006-12-29 11:34:58 · update #10
SQ_27 Taoyuan Airport Singapore 2006/12/21_07:10 2006/12/22_07:10 4 181 27 11
CX_465 Bangkok Hong Kong 2006/12/21_07:10 2006/12/22_07:10 5 97 29 156
2006-12-29 11:35:02 · update #11
現在就是在計算位子的地方出問題了。
沒錯,檔案很大,
所以我想知道怎樣計算位子在覆寫回去,
我所用的fseek(input,i*sizeof(data_t),SEEK_SET);好像算錯的樣子...
2006-12-29 11:41:31 · update #12
測試檔內容:
SQ_27 Taoyuan Airport Singapore 2006/12/21_07:10 2006/12/22_07:10 4 181 27 11
SQ_27 Taoyuan Airport Singapore 2006/12/21_07:10 2006/12/22_07:10 4 181 27 11
2006-12-29 11:42:39 · update #13
CX_465 Bangkok Hong Kong 2006/12/21_07:10 2006/12/22_07:10 5 97 29 156
1 2 3 4 5 6 7 8 9
2006-12-29 11:42:44 · update #14
我想蓋掉1 2 3 4 5 6 7 8 9時的情景:
SQ_27 Taoyuan Airport Singapore 2006/12/21_07:10 2006/12/22_07:10 4 181 27 11
SQ_27 Taoyuan Airport Singapore 2006/12/21_07:10 2006/12/22_07:10 4 181 27 11
2006-12-29 11:43:42 · update #15
CX_465 Bangkok Hong Kong 2006/12/21_07:10 2006/12/22_07:10 5 97 29 156
1 2 3 No_data No_data No_data No_data No_data 0 0 0 0
2006-12-29 11:43:47 · update #16
簡而言之多了3個字元?
2006-12-29 11:44:21 · update #17
可見不是...
我的MSN:a770915@hotmail.com
感謝...
2006-12-29 11:50:33 · update #18
你可以先計算位子
然後在去存取
一般我的建議先把資料全部讀出來然後在變數中變更玩在全部覆寫回去
如果是檔案大我會先用函式尋找目標計算位子然後在進行複寫
2006-12-29 16:40:12 補充:
我還記得你之前有問過他的存取
你在可以使用\t來存寫分隔
不要寫吶的多
2006-12-29 16:46:19 補充:
如果可以用及時通聊會更快
我知道你原因卡在哪邊,你在試一下是不是每次算出來的位子都會多3個位子出來如果是位子-3就好了
2006-12-29 16:48:18 補充:
fseek(input,i*sizeof(data_t),SEEK_SET);你的i*事做什麼用的
如果只是要算長度sizeof(data_t)就可以了如果你的I代表你的資料筆數我建議你計算位元長度會比較準
2006-12-29 16:49:46 補充:
或許是你要自己算看看可能因為一些原因多算了幾個位子
直接寫-3很不穩定只是個暫時解決辦法
主要是你要查出到底哪邊多3出來
2006-12-29 17:04:35 補充:
i=0;
while((fgets(str,sizeof(str),fp)) != 0 )
{
num[i]=sizeof(str);
i ;
}
假如要做掉第3行
只要for(i=0;i<=3;i )
{
temp=temp num[i];
}
2006-12-29 11:32:12 · answer #1 · answered by 永恆的破壞 5 · 0⤊ 0⤋
建議把檔案改成隨機存取檔案~不要用現在在用的循序存取檔案~
這樣的用法會連你之前問的問題"[C語言]當讀入的文字檔資料中有空白怎麼辦? "都一併解決~至於隨機存取檔案要怎麼用就請您去參考相應的書籍嘍~裡頭會講的比較詳細~
p.s: 它並不是二進位檔
2006-12-29 12:07:29 · answer #2 · answered by Euphoria 2 · 0⤊ 0⤋