| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 904 人关注过本帖
标题:关于文件的函数
只看楼主 加入收藏
wlesd
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2009-7-5
结帖率:80%
收藏
 问题点数:0 回复次数:10 
关于文件的函数
fread,fwrite写入不是以2进制写入么
为什么我写入fwrite("name",8,1,fp);
在文件里却显示name,不是二进制码?

其实我想问,保存属于自己的文件名后缀然后怎么以自己的独特方式打开,
换句话说就是加密吧是吗?我想打开的时候是乱码!

[ 本帖最后由 wlesd 于 2012-2-27 20:28 编辑 ]
搜索更多相关主题的帖子: 加密 函数 二进制 
2012-02-27 20:27
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:0 
二进制写入的是ASCII码,其实是文本文件.如果想打开的是乱码,可以自己实现加密.比如每个字符的ASCII码加10,或者-50.然后在自己打开时再做相应的处理.别人打开时就会是乱码了

成功贵在坚持
2012-02-27 21:38
wlesd
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2009-7-5
收藏
得分:0 
那fread,fwrite和其它写入函数到底有什么区别呢?
2012-02-27 22:27
seeworld
Rank: 2
等 级:论坛游民
帖 子:19
专家分:39
注 册:2011-10-7
收藏
得分:0 
本质都是读写数据,只是特点不同而已
2012-02-27 23:22
seeworld
Rank: 2
等 级:论坛游民
帖 子:19
专家分:39
注 册:2011-10-7
收藏
得分:0 
你的问题让人看不明白
2012-02-27 23:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 楼主 wlesd
沒學過計算機基礎?都不知道怎麼跟你解釋這個問題為好。總之,你還缺乏“同一個數據實體可以表現為不同形象”的意識。比如,對十進制整數32,你覺得是整數還是字符?當你用fwrite()把整數32寫在磁盤文件上的時候,它確實是以二進制00100000數據記錄的,但你“看”這個文件的時候,供你“看”的那個軟件可能把它呈現為空格讓你看,因為它把32解釋成空格。回憶你自己寫程序時用'A'+1表示'B'的做法就知道了,用字符跟整數相加,雖然原則上字符不是整数,但你一直視'A'為整數,然後又把整數視為字符,不是嗎?事實上,你用fprintf(fp, "%c", 65)輸出一個整數到文件上,然後看看,那是整數嗎?

因此,關鍵是你如何“看”的,用什麼軟件、什麼手段“看”,是它們給你“看”什麼的問題。

[ 本帖最后由 TonyDeng 于 2012-2-28 01:48 编辑 ]
收到的鲜花
  • wlesd2012-02-29 12:28 送鲜花  3朵   附言:好文章

授人以渔,不授人以鱼。
2012-02-27 23:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
二進制文件和文本文件的讀寫,區別在是否轉換數據的外在形式。比如,對整數32,如果你用二進制fwrite()寫,那麼它的輸出結果是1byte的數據,但如果用fprintf(fp, "%d", 32)寫,那麼得到的結果是2byte的字符串'32'。現在看到區別了嗎?如果你用fprintf(fp, "%c", 32)寫,那麼其結果跟前面用fwrite()的完全一樣。對32位的整數,無論它的值多大,用二進制輸出,永遠是32位4字節,但如果用fprintf("%d")輸出,那麼佔用空間就由數值的十進制字符串決定,8位的整數就佔用8byte,用fprintf("%x")輸出,就由十六進制的字符串決定。注意:你所操作的,都是同一個數!

同樣,讀回來時,讀到什麼,也取決於你的讀法。不同的讀法,即使是同一個數,也會得到不同的結果。

原則上,文件跟屏幕是一回事。控制臺的標準輸入(stdin)輸出(stdout)其實就是一個文件句柄,是一個特殊的FILE數據,專用的而已。讀寫文件的原理跟在控制臺上讀寫數據是一樣的。所謂的printf(……),其實是fprintf(stdout,……)

文本文件和二進制文件,其實沒什麼質的區別,不過是有若干小細節的默認處理不同而已。對程序員來說,完全可以把二進制文件操作成跟文本文件一樣,或者反過來。這一切取決於你自己。

[ 本帖最后由 TonyDeng 于 2012-2-27 23:58 编辑 ]

授人以渔,不授人以鱼。
2012-02-27 23:37
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
T版 回答的很认真。
2012-02-28 01:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
沒有自己做過輸入輸出函數的人,在使用scanf("%d", &x)這樣的函數輸入數據時,覺得在鍵盤上敲下123是一個整數,其實是個誤區。事實上,那是在輸入一個字符串"123",這個字符串進入scanf()之後,scanf()函數根據格式碼"%d"判斷,應該把輸入解釋成十進制整數,於是開始對這個字符串做變換處理(就像平時做練習那樣,把字符串變成數字或把數字變成字符串,很多人都做過的),然後把變換得到的結果,賦值給x(必須使用x的地址指針,原因是scanf()無法返回多個數據,所以才要用指針賦值,其實你完全可以自編一個不用指針的輸入函數,直接返回數據)。由於是指針賦值,所以scanf()並不理會目的變量x是否真的能夠容納結果數值,即使x其實是一個char,scanf()也是根據"%d"指示當x是int強行灌入數據,這樣,各種各樣的運行時錯誤就千奇百怪地冒出來了,全部都是這樣造成的。

同樣,在printf("%d", 123)的時候,我們看到的輸出其實是字符串(char[4]),不是你以為的整數。因此,只要你用fprinft(fp, "%d", x)輸出,那麼就必須用fscanf(fp, "%d", &x)讀回來,字符串對字符串,做逆運算;如果用fwrite(&x, sizeof(x), 1, fp)輸出,那麼就必須用fread(&x, sizeof(x), 1, fp)讀回來。如果不是這樣,那麼你就必須自己做scanf()或printf()函數的轉換動作,這個時候,就是你可以把文本文件中字符串"123456"解釋成(比如)整數123和456的時候,或者解釋成123456也行,都是你的自由。如果你明白這些原理,那麼在scanf("%d%d", &x, &y)遇到問題的時候,就不至於茫然不知所以然了。

如果你要加密,可以輸出fprintf("%d", 'A', fp)看看,把明文中的每個字符都用內碼輸出,那麼,你看到生成的文件就全是數字字符。讀回來,你自己想吧。明白上面所說的原理,你搞什麼手腳都可以,比如可以不用十進制,用二進制、十六進制,甚至二十進制也可以。不明白這些原理,你學一輩子C,不過色即是空。

fwrite()和fread()的優勢在哪裡呢?優勢是把內存直接複製出來或讀回去,完全不用轉換。比如對控制臺窗口整個屏幕,用這一條指令就可以把整塊屏幕或局部矩形方塊copy到硬盤上,不用理會都有什麼內容、什麼顏色的文字,完全複製,完全恢復,速度飛快(做遊戲時必用,橫移豎移畫面都是用這個技術做的,不會重新畫圖,從硬盤中讀入事先製作好的畫面就是了)。跟memcpy()或memmove()是一個東西。


[ 本帖最后由 TonyDeng 于 2012-2-28 02:54 编辑 ]

授人以渔,不授人以鱼。
2012-02-28 02:35
fahfuq
Rank: 2
等 级:论坛游民
帖 子:30
专家分:23
注 册:2012-1-21
收藏
得分:0 
飘过
2012-02-28 10:01
快速回复:关于文件的函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058342 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved