if((fp=fopen("random.txt","w"))==NULL);
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供玉溪網(wǎng)站建設、玉溪做網(wǎng)站、玉溪網(wǎng)站設計、玉溪網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、玉溪企業(yè)網(wǎng)站模板建站服務,10多年玉溪做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
{
fprintf(stderr,"\nError1 opening file.");
exit(1);
}應該是到這里就錯誤了。。。
這里不是很清楚嗎?輸出Error1 opening file.
就是因為文件打開錯誤,你看看文件命名和文件放置的位置,實在不行,在random.txt那改成全路徑
還有,做的時候最好把后綴顯示出來
1、首先需要下載專門的c語言編程軟件,一般從百度下載就可以。
2、打開下載好的c語言編程軟件,界面如下圖所示。
3、在標題下方點擊打開項目,操作如下圖所示。
4、軟件會自動幫你找到自己做的文件,點擊需要打開的文件。
5、可以看到文件打開,自己可以進行查看,或者修改,添加程序。
C語言fopen函數(shù)用于打開文件。
函數(shù)原型:FILE
*
fopen(const
char
*
path,const
char
*
mode);
參數(shù):
path
字符串類型,表示文件所在的路徑,包括文件名
mode
打開文件的模式、
返回值:文件順利打開后,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,并把錯誤代碼存在errno
中。
mode:
r
以只讀方式打開文件,該文件必須存在。
r+
以可讀寫方式打開文件,該文件必須存在。
rb+
讀寫打開一個二進制文件,允許讀寫數(shù)據(jù),文件必須存在。
w
打開只寫文件,若文件存在則文件長度清為0,即該文件內(nèi)容會消失。若文件不存在則建立該文件。
w+
打開可讀寫文件,若文件存在則文件長度清為零,即該文件內(nèi)容會消失。若文件不存在則建立該文件。
a
以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數(shù)據(jù)會被加到文件尾,即文件原先的內(nèi)容會被保留。(EOF符保留)
a+
以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數(shù)據(jù)會被加到文件尾后,即文件原先的內(nèi)容會被保留。
(原來的EOF符不保留)
wb
只寫打開或新建一個二進制文件;只允許寫數(shù)據(jù)。
wb+
讀寫打開或建立一個二進制文件,允許讀和寫。
ab+
讀寫打開一個二進制文件,允許讀或在文件末追加數(shù)據(jù)。
實例:
#includestdio.h
#define
F_PATH
"d:\\myfile\\file.dat"
int
main(void)
{
FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp)
{
return
-1;//要返回錯誤代碼
}
fclose(fp);
fp=NULL;//需要指向空,否則會指向原打開文件地址
return
0;
}
ANSI
C規(guī)定文件打開用函數(shù)fopen,關閉為fclose。
1、調(diào)用方式通常為:
代碼如下:
FILE
*fp;
fp=fopen(文件名,
打開方式);
2、參數(shù)說明:
文件名:
形如"myfile.dat"、"F:\data\myfile.dat"等等;
打開方式:
"r"(只讀)
為輸入打開一個文本文件
"w"(只寫)
為輸出打開一個文本文件
"a"(追加)
向文件文件尾添加數(shù)據(jù)
"rb"(只讀)
為輸入打開一個二進制文件
"wb"(只寫)
為輸出打開一個二進制文件
"r+"(讀寫)
為讀寫打開一個文本文件
"w+"(讀寫)
為讀寫建立一個新的文本文件
"a+"(讀寫)
為讀寫打開一個文本文件
"rb+"(讀寫)
為讀寫打開一個二進制文件
"wb+"(讀寫)
為讀寫建立一個新的二進制文件
"ab+"(讀寫)
為讀寫打開一個二進制文件
3、注意:
(1)用"r"方式打開的文件,不能向其輸入數(shù)據(jù),并且該文件已存在,否則出錯;
(2)用"w"方式打開的文件,只能向該文件輸入數(shù)據(jù),如果所打開的文件不存在,則在打開時新建一個以指定的名字命名的文件;如果指定文件存在,則在打開時將該文件刪去,然后新建一個新的文件;
(3)如果函數(shù)fopen打開文件出錯,則fopen返回一個空指針值NULL;
(4)在程序開始運行時,系統(tǒng)自動打開3個標準文件:標準輸入(stdin),標準輸出(stdout),標準出錯輸
出(stderr)。如果要使用輸入輸出終端,則不需要打開,可以直接使用,如fputc(stdout,'a');向屏幕輸出字符a。
c語言標準庫函數(shù)里沒有error函數(shù)。C語言對異常的處理確實不夠好,大多的時候都需要人工除錯。
有幾個類似的函數(shù),分別處理各種情況下的異常:
ferror函數(shù):在調(diào)用各種輸入輸出函數(shù)(如
putc.getc.fread.fwrite等)時,如果出現(xiàn)錯誤,除了函數(shù)返回值有所反映外,還可以用ferror函數(shù)檢查。
它的一般調(diào)用形式為
ferror(fp);如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯。應該注意,對同一個文件
每一次調(diào)用輸入輸出函數(shù),均產(chǎn)生一個新的ferror函
數(shù)值,因此,應當在調(diào)用一個輸入輸出函數(shù)后立即檢
查ferror函數(shù)的值,否則信息會丟失。在執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值自動置為0。在庫函數(shù)中有個errno變量,每個errno值對應著以字符串表示的錯誤類型。當你調(diào)用"某些"函數(shù)出錯時,該函數(shù)已經(jīng)重新設置了errno的值。perror函數(shù)只是將你輸入的一些信息和現(xiàn)在的errno所對應的錯誤一起輸出。
perror函數(shù):
用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標準設備(stderr)。參數(shù)
s
所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量errno
的值來決定要輸出的字符串。
strerror函數(shù):用來
從錯誤號碼
查
用英文表達的錯誤內(nèi)容,返回指針,指向這段英文字符串。如果你不知道錯誤號,那么在出錯發(fā)生時,及時用
errno
的當前值
作參數(shù),打印這段字符串。
errno會返回一個數(shù)字,每個數(shù)字代表一個錯誤類型。詳細的可以查看頭文件。/usr/include/asm/errno.h
如何把errno的數(shù)字轉(zhuǎn)換成相應的文字說明?
方式一:可以使用strerrno函數(shù)
char
*strerror(int
errno)
使用方式如下:
fprintf(stderr,"error
in
CreateProcess
%s,
Process
ID
%d
",strerror(errno),processID)
將錯誤代碼轉(zhuǎn)換為字符串錯誤信息,可以將該字符串和其它的信息組合輸出到用戶界面。
注:假設processID是一個已經(jīng)獲取了的整形ID
方式二:使用perror函數(shù)
void
perror(const
char
*s)
函數(shù)說明
perror
(
)用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標準錯誤(stderr),參數(shù)s
所指的字符串會先打印出,后面再加上錯誤原因
字符串。此錯誤原因依照全局變量
errno
的值來決定要輸出的字符串。
另外并不是所有的c函數(shù)調(diào)用發(fā)生的錯誤信息都會修改errno。例如gethostbyname函數(shù)。
errno是否是線程安全的?
errno是支持線程安全的,而且,一般而言,編譯器會自動保證errno的安全性。
我們看下相關頭文件
/usr/include/bits/errno.h
會看到如下內(nèi)容:
#
if
!defined
_LIBC
||
defined
_LIBC_REENTRANT
/*
When
using
threads,
errno
is
a
per-thread
value.
*/
#
define
errno
(*__errno_location
())
#
endif
#
endif
/*
!__ASSEMBLER__
*/
#endif
/*
_ERRNO_H
*/
也就是說,在沒有定義__LIBC或者定義_LIBC_REENTRANT的時候,errno是多線程/進程安全的。
為了檢測一下你編譯器是否定義上述變量,不妨使用下面一個簡單程序。
#include
stdio.h
#include
errno.h
int
main(
void
)
{
#ifndef
__ASSEMBLER__
printf(
"Undefine
__ASSEMBLER__/n"
);
#else
printf(
"define
__ASSEMBLER__/n"
);
#endif
#ifndef
__LIBC
printf(
"Undefine
__LIBC/n"
);
#else
printf(
"define
__LIBC/n"
);
#endif
#ifndef
_LIBC_REENTRANT
printf(
"Undefine
_LIBC_REENTRANT/n"
);
#else
printf(
"define
_LIBC_REENTRANT/n"
);
#endif
return
0;
}