fopen函數簡介

函數簡介

函數功能:打開一個文件

函數原型:FILE * fopen(const char * path,const char * mode);

相關函數:openfclosefopen_s[1]_wfopen

所需庫:<stdio.h>

返回值:文件順利打開后,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,并把錯誤代碼存在errno 中。

一般而言,打開文件后會做一些文件讀取或寫入的動作,若打開文件失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()后作錯誤判斷及處理。

參數說明:

參數path字符串包含欲打開的文件路徑及文件名,參數mode字符串則代表著流形態

mode有下列幾種形態字符串:

r 只讀方式打開文件,該文件必須存在。

r+ 以可讀寫方式打開文件,該文件必須存在。

rb+ 讀寫打開一個二進制文件,允許讀寫數據,文件必須存在。

rw+ 讀寫打開一個文本文件,允許讀和寫。

w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。

w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。

a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)

a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。 (原來的EOF符不保留)

wb 只寫打開或新建一個二進制文件;只允許寫數據。

wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。

ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。

at+ 打開一個叫string的文件,a表示append,就是說寫入處理的時候是接著原來文件已有內容寫入,不是從頭寫入覆蓋掉,t表示打開文件的類型是文本文件,+號表示對文件既可以讀也可以寫

上述的形態字符串都可以再加一個b字符,如rbw+bab+等組合,加入b 字符用來告訴函數庫以二進制模式打開文件。如果不加b,表示默認加了t,即rt,wt,其中t表示以文本模式打開文件。由fopen()所建立的新文件會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此文件權限也會參考umask 值。

有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。

二進制和文本模式的區別

1.windows系統中,文本模式下,文件以"\r\n"代表換行。若以文本模式打開文件,并用fputs等函數寫入換行符"\n"時,函數會自動在"\n"前面加上"\r"。即實際寫入文件的是"\r\n"

2.在類Unix/Linux系統中文本模式下,文件以"\n"代表換行。所以Linux系統中在文本模式和二進制模式下并無區別。

打開方式總結:各種打開方式主要有三個方面的區別:

①打開是否為二進制文件,用“b”標識。

②讀寫的方式,有以下幾種:只讀、只寫、讀寫、追加只寫、追加讀寫這幾種方式。

③對文件是否必須存在、以及存在時是清空還是追加會有不同的響應。具體判斷如下圖。

9c16fdfaaf51f3deea1fbd2a96eef01f3b2979ca.jpg



程序示例

示例一

#include<stdio.h>

?

#defineF_PATH"d:\\myfile\\file.dat"

intmain(void)

{

FILE*fp=NULL;//需要注意

fp=fopen(F_PATH,"r");

if(NULL==fp)

{

return-1;//要返回錯誤代碼

}

fclose(fp);

fp=NULL;//需要指向空,否則會指向原打開文件地址

return0;

}

示例二

#include<stdio.h>

#include<stdlib.h>//為了使用exit()

intmain()

{

charch;

FILE*fp=NULL;

charfname[50];//用于存放文件名

printf("輸入文件名:");

scanf("%s",fname);

fp=fopen(fname,"r");//只供讀取

if(fp==NULL)//如果失敗了

{

printf("錯誤!");

exit(1);//中止程序

}

while((ch=getc(fp))!=EOF)

putchar(ch);

fclose(fp);//關閉文件

return0;

}

注意!初學者往往會犯一個錯誤,即在輸入文件名時不加后綴名,請注意加上!(為什么文件一定要有后綴名?)

示例三[2]

#include<stdio.h>

?

FILE*stream,*stream2;

?

intmain(void)

{

intnumclosed;

//Openforread(willfailiffile"crt_fopen.c"doesnotexist)

if((stream=fopen("crt_fopen.c","r"))==NULL)//C4996

//Note:fopenisdeprecated;considerusingfopen_sinstead

printf("Thefile'crt_fopen.c'wasnotopened\n");

else

printf("Thefile'crt_fopen.c'wasopened\n");

//Openforwrite

if((stream2=fopen("data2","w+"))==NULL)//C4996

printf("Thefile'data2'wasnotopened\n");

else

printf("Thefile'data2'wasopened\n");

//ClosestreamifitisnotNULL

if(stream)

{

if(fclose(stream))

{

printf("Thefile'crt_fopen.c'wasnotclosed\n");

}

}

//Allotherfilesareclosed:

numclosed=_fcloseall();

printf("Numberoffilesclosedby_fcloseall:%u\n",numclosed);

}


注意

在文件操作時,需要注意以下幾點問題

1、在定義文件指針時,要將文件指針指向空;如 FILE *fp = NULL;

2、文件操作完成后,需要將文件關閉,一定要注意,否則會造成文件所占用內存泄露和在下次訪問文件時出現問題。

3、文件關閉后,需要將文件指針指向空,這樣做會防止出現游離指針,而對整個工程造成不必要的麻煩;如:fp = NULL;



二進制文件


廣義的二進制文件即指文件,由文件在外部設備的存放形式為二進制而得名。狹義的二進制文件即除文本文件以外的文件。文本文件是一種由很多行字符構成的計算機文件。文本文件存在于計算機系統中,通常在文本文件最后一行放置文件結束標志。文本文件的編碼基于字符定長,譯碼相對要容易一些;二進制文件編碼是變長的,靈活利用率要高,而譯碼要難一些,不同的二進制文件譯碼方式是不同的。

從本質上來說他們之間沒有什么區別,因為他們在硬盤上都有一種的存放方式--二進制,但是如果要對他們有些區分的話,那可以這樣理解。每個字符由一個或多個字節組成,每個字節都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些數據沒有對應任何字符的任何字節。如果一個文件中的每個字節的內容都是可以表示成字符的數據,我們就可以稱這個文件為文本文件,可見,文本文件只是二進制文件中的一種特例,為了與文本文件相區別,人們又把除了文本文件以外的文件稱為二進制文件,由于很難嚴格區分文本文件和二進制文件的概念,所以我們可以簡單地認為,如果一個文件專門用于存儲文本字符的數據,沒有包含字符以外的其他數據,我們就稱之為文本文件,除此之外的文件就是二進制文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383474.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【kali】kali換了root權限后無法打開firefox瀏覽器

從普通權限換成root權限后發現火狐進不去鳥&#xff01;&#xff01; 終端報錯&#xff1a; Running firefox as root in a regular user’s sessin is not supported.($HOME is /home/miehahaha which is owned by uid 1000) 分析&#xff1a; 是的&#xff0c;原來普通權限m…

【win10】局域網內兩臺win10共享文件夾

https://jingyan.baidu.com/article/93f9803f3e9788e0e46f55c8.html

CentOS 7關閉firewalld啟用iptables

在CentOS7中&#xff0c;有很多CentOS 6中的常用服務發生了變化。 其中iptables是其中比較大的一個。防火墻iptables被firewalld取代。 本文將介紹&#xff0c;如果采用systemctl關閉firewalld&#xff0c;開啟iptables。 1.關閉firewalld [roothwcentos70-01 system]# systemc…

wpa_supplicant wifi密碼錯誤檢測

system("/usr/sbin/wpa_supplicant -Dnl80211 -iwlan0 -f /tmp/wpa_log -c/tmp/wpa_supplicant.conf -d -t -B &"); 在/tmp/wpa_log中查看是否有如下的字符串&#xff1a; 1. 針對WPA&#xff0f;WPA2加密方式 //1473218403.305655: wlan0: WPA: 4-Way Handsh…

CentOS 7 安裝nginx

1.安裝pcre pcre-devel yum install pcre pcre-devel -y rpm -qa pcre pcre-devel 2.安裝openssl-devel yum install -y openssl-devel rpm -qa openssl-devel openssl 3.下載nginx cd /home/testuser/mkdir toolscd tools/wget -q http://nginx.org/download/nginx-1.9.9.…

MPEG4與.mp4

流媒體應用中TS和MP4格式分析應該是封包格式。不能簡單理解成MPEG4的簡稱。要詳細解釋這個問題&#xff0c;需要提一下MPEG4和.mp4在概念上的區別。 一般來說&#xff0c;僅提“MPEG4”&#xff0c;是指一種視頻壓縮算法。可以把原始畫面通過數學運算變換成一組二進制數據&…

MP4文件格式的解析,以及MP4文件的分割算法

mp4應該算是一種比較復雜的媒體格式了&#xff0c;起源于QuickTime。以前研究的時候就花了一番的功夫&#xff0c;尤其是如何把它完美的融入到視頻點播應用中&#xff0c;更是費盡了心思&#xff0c;主要問題是處理mp4文件龐大的“媒體頭”。當然&#xff0c;流媒體點播也可以采…

MP4文件格式詳解

一、基本概念 1.mp4概述 MP4文件中的所有數據都裝在box&#xff08;QuickTime中為atom&#xff09;中&#xff0c;也就是說MP4文件由若干個box組成&#xff0c;每個box有類型和長度&#xff0c;可以將box理解為一個數據對象塊。box中可以包含另一個box&#xff0c;這種box稱為c…

H264—MP4格式及在MP4文件中提取H264的SPS、PPS及碼流

SkySeraph Apr 1st 2012 Email&#xff1a;skyseraph00163.com 一、MP4格式基本概念 MP4格式對應標準MPEG-4標準(ISO/IEC14496) 二、MP4封裝格式核心概念 1 MP4封裝格式對應標準為 ISO/IEC 14496-12&#xff08;信息技術 視聽對象編碼的第12部分: ISO 基本媒體文件格式/Info…

AAC音頻格式分析

關于AAC音頻格式基本情況&#xff0c;可參考維基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音頻格式分析 AAC音頻格式有ADIF和ADTS&#xff1a; ADIF&#xff1a;Audio Data Interchange Format 音頻數據交換格式。這種格式的特征是可以確定的找到這個音頻數…

tar壓縮隱藏文件

如果想tar 壓縮包含隱藏文件的目錄&#xff0c;同時排除掉部分無用的目錄 tar -czvf 20161009.tar.gz * .[!.]* --exclude .git 在Linux下打包tar文件時添加密碼的方法 在當前目錄下有一個pma目錄的文件夾: 1、使用tar對文件壓縮加密&#xff1a; 代碼如下: # tar -zcvf - pma…

linux 怎么把^M去掉

在linux下&#xff0c;不可避免的會用VIM打開一些windows下編輯過的文本文件。我們會發現文件的每行結尾都會有一個^M符號&#xff0c;這是因為 DOS下的編輯器和Linux編輯器對文件行末的回車符處理不一致&#xff0c; 對于回車符的定義&#xff1a; windows&#xff1a;0D0A un…

關于cp命令中拷貝所有的寫法

今天在編寫一個腳本的時候&#xff0c;發現一個比較奇怪的問題&#xff1a;就是在使用cp拷貝當前目錄下所有文件到目標目錄的時候&#xff0c;源和目標大大不同。原來一直沒有留意有這樣的問題&#xff0c;后來查了些資料&#xff0c;才知道以前一直使用的格式有誤&#xff0c;…

cp -r 和 cp -R 的區別

今天倒騰linux根文件系統的時候發現 cp -r /dev /dev_bak 時&#xff0c;竟然會 將磁盤設備中的數據進行一次拷貝&#xff0c;而不是僅僅建立設備文件。于是到網上搜了一把&#xff0c;收獲不小。http://www.loveunix.net/html/200407/33920.html這里有人問同樣的問題&#xff…

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用于 C 編譯器的選項&#xff0c; CXXFLAGS 表示用于 C 編譯器的選項。 這兩個變量實際上涵蓋了編譯和匯編兩個步驟。 CFLAGS&#xff1a; 指定頭文件&#xff08;.h文件&#xff09;的路徑&#xff0c;如&#xff1a;CFLAGS-I/usr/include -I/path/include。同樣地…

smbclient和掛載samba共享目錄

1&#xff0c;列出某個IP地址所提供的共享文件夾 smbclient -L 198.168.0.1 -U marsaber%12332112345672,像FTP客戶端一樣使用smbclient smbclient //192.168.0.1/tmp -U marsaber%1233211234567 執行smbclient命令成功后&#xff0c;進入smbclient環境&#xff0c;出現提示符…

linux 下source命令

當我修改了/etc/profile文件&#xff0c;我想讓它立刻生效&#xff0c;而不用重新登錄&#xff1b;這時就想到用 source 命令&#xff0c;如:source /etc/profile對source進行了 學習 &#xff0c;并且用它與sh 執行腳本進行了對比&#xff0c;現在總結一下。source命令&#x…

make Image uImage與zImage的區別

內核編譯&#xff08;make&#xff09;之后會生成兩個文件&#xff0c;一個Image&#xff0c;一個zImage&#xff0c;其中Image為內核映像文件&#xff0c;而zImage為內核的一種映像壓縮文件&#xff0c;Image大約為4M&#xff0c;而zImage不到2M。 那么uImage又是什么的&#…

ubuntu下tftp的安裝、配置、使用

1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 0777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配置$ sudo vi /etc/default/tftpd-hpa# /etc/default/tftpd-hpaTFTP_USERNAME&…

ubuntu下搭建nfs服務器

1.1 搭建NFS服務器 NFS&#xff08;Network FileSystem&#xff0c;網絡文件系統&#xff09;是由SUN公司發展&#xff0c;并于1984年推出的技術&#xff0c;用于在不同機器&#xff0c;不同操作系統之間通過網絡互相分享各自的文件。NFS設計之初就是為了在不同的系統間使…