亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 8247 | 回復(fù): 16
打印 上一主題 下一主題

一段簡(jiǎn)單的讀文件c程序. 有些疑問. [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2003-05-29 22:17 |只看該作者 |倒序?yàn)g覽
cfg文件只有一行ss.
我把問題寫在注釋中.

  1. #include <stdio.h>;

  2. int main(){
  3.         FILE *dat;
  4.         dat=fopen("./cfg","rt");
  5.         fseek(dat,0,SEEK_END);
  6.         long int k=ftell(dat);                            //這里是3

  7.         char*  input=(char*)malloc(k*sizeof(char));   //分配3byte, 起始地址是xxxx80
  8.         rewind(dat);
  9.         *input=fgetc(dat);
  10.         while(!feof(dat)){
  11.                 *(++input)=fgetc(dat);
  12.         }
  13. //在這里發(fā)現(xiàn)input總會(huì)跳到第4個(gè)地址0xxxx83,可這個(gè)                                                                            //地址不是他的啊.奇怪的是結(jié)果倒是對(duì)的
  14.         fclose(dat);
  15.         printf("%s",input-k);                  //一直覺得應(yīng)該是input-k+1
  16.         return 1;
  17. }

復(fù)制代碼

看了半天,不明所以.是不是有什么概念錯(cuò)誤?   
  1. [/code][code]
復(fù)制代碼

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2003-05-29 23:00 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.


  1. *(++input)=fgetc(dat);
復(fù)制代碼

改成

  1. *(input++)=fgetc(dat);
復(fù)制代碼

就好了。

個(gè)人覺得,為了代碼清晰,用以下的方式好:

  1. *input=fgetc(dat);
  2. input++;
復(fù)制代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2003-05-30 02:00 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

這樣改就不對(duì)了.因?yàn)槿绱司蜁?huì)無(wú)條件地input++而很可能會(huì)超出分配給她的內(nèi)存了.
input++;
*input=fgetc(dat);
就是和我的一樣.
我的問題是:
對(duì)于3個(gè)byte 文件 cfg中僅有一行的 ss來(lái)說(shuō), 為什么我在讀完了3byte后,還會(huì)再次進(jìn)入循環(huán),讀一個(gè)?字符.
暈啊.

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
4 [報(bào)告]
發(fā)表于 2003-05-30 13:42 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

??
怎么會(huì)一樣,你以前的是地址先往前移動(dòng),再賦值,當(dāng)然會(huì)浪費(fèi)一個(gè)了。
你在仔細(xì)看看區(qū)別。
另外你的程序也沒有初始化這塊分配的內(nèi)存,為了放置結(jié)束符,應(yīng)該多分配一個(gè)字符空間。讀完之后,需要結(jié)束。

  1. int main(){
  2.         FILE *dat;
  3.         dat=fopen("./cfg","rt");
  4.         fseek(dat,0,SEEK_END);
  5.         long int k=ftell(dat);                            //這里是3

  6.         char*  input=(char*)malloc((k+1)*sizeof(char));   //分配3byte, 起始地址是xxxx80
  7.         rewind(dat);
  8.         *input=fgetc(dat);
  9.         while(!feof(dat)){
  10.                 *input=fgetc(dat);
  11.                 input++;

  12.         }
  13.              *input = '\0';
  14.         fclose(dat);
  15.         printf("%s",input-k);                  //一直覺得應(yīng)該是input-k+1
  16.         return 1;
  17. }
復(fù)制代碼


自己試試看吧

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2003-05-31 05:04 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

先謝謝你的回答.我還是初學(xué)者,所以想把一些細(xì)節(jié)搞搞清楚.
在我的例中.我先*input=fgetc(dat),然后再進(jìn)入循環(huán),所以首先得input++,再*input=fgetc(dat).
而你的例中,看起來(lái)好象第一個(gè)字符被第二個(gè)字符覆蓋了.

不知道我說(shuō)的對(duì)不對(duì).
另外一個(gè)問題關(guān)于"\0"這個(gè)結(jié)束符,在存成文件的時(shí)候,該不該存進(jìn)去啊?

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2003-05-31 10:09 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

你的程序沒有在字符串后面補(bǔ)\0;
malloc內(nèi)存的時(shí)候沒有為\0多申請(qǐng)一個(gè)char;
不應(yīng)該在feof監(jiān)測(cè)之前就fgetc,文件可能是0字節(jié)長(zhǎng);
取得malloc對(duì)分配的指針不應(yīng)該改變;
堆使用完后沒有free;
程序有點(diǎn)亂(可能咱倆思維習(xí)慣不同),我寧愿這樣寫:


  1. #include <stdio.h>;

  2. int main(){
  3.         FILE *dat;
  4.         long int k,i=0;
  5.         char tmp,*input;

  6.         dat=fopen("./cfg","rt");
  7.         fseek(dat,0,SEEK_END);
  8.         k=ftell(dat);
  9.         input=(char*)malloc((k+1)*sizeof(char));
  10.         rewind(dat);
  11.         while(!feof(dat)){
  12.                 tmp=fgetc(dat);
  13.                 if (tmp==EOF) tmp='\0';
  14.                 input[i++]=tmp;
  15.         }
  16.         fclose(dat);
  17.         printf("%s\n",input);
  18.         free(input);
  19.         return 1;
  20. }
復(fù)制代碼

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
7 [報(bào)告]
發(fā)表于 2003-05-31 12:36 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

哦,沒注意while前面還有個(gè)fgetc,去掉,我那程序就正確了。

為了malloc空間的釋放和指針的完整,確實(shí)應(yīng)該采用JohnBull的風(fēng)格。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2003-05-31 15:21 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

可按JohnBull 的程序編譯通過(guò)
但執(zhí)行時(shí)總是提示 “Segmentation fault"
能說(shuō)明是什么原因么?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2003-05-31 16:01 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

原帖由 "xjleijie" 發(fā)表:
可按JohnBull 的程序編譯通過(guò)
但執(zhí)行時(shí)總是提示 “Segmentation fault"
能說(shuō)明是什么原因么?
   

因?yàn)槲覟榱瞬粚?duì)他的程序做太大的改動(dòng)所以沒有檢查fopen是否成功。你肯定沒建cfg。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2003-06-01 00:35 |只看該作者

一段簡(jiǎn)單的讀文件c程序. 有些疑問.

感謝johnbull大牛的提醒. 你的回貼向來(lái)很精彩,一錘定音.
如此看來(lái)在文件的末尾還有一個(gè)EOF字符. 而feof()只有在這個(gè)字符之后,才會(huì)返回true.
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP