c語言files
❶ c語言中的FILE的用法!
#include
<stdio.h>
FILE類型是C語言的本身具有的類型。只要把這標准輸入輸出的頭文件「stdio.h」
包含在程序中,就可以使用文件類型FILE,不用再另外定義。
❷ 利用c語言編寫 讀出一文件名為file的內容並顯示
不用我做了,看這個就可以了。
1.2.1 標准文件函數
標准文件函數主要包括文件的打開、關閉、讀和寫等函數。不象BASIC 、
FORTRAN語方有順序文件和隨機文件之分, 在打開時就應按不同的方式確定。
Turbo C2.0並不區分這兩種文件, 但提供了兩組函數, 即順序讀寫函數和隨機讀
寫函數。
一、文件的打開和關閉
任何一個文件在使用之前和使用之後, 必須要進行打開和關閉, 這是因為操
作系統對於同時打開的文件數目是有限制的, DOS操作系統中, 可以在DEVICE
.SYS中定義允許同時打開的文件數n(用files=n定義)。其中n 為可同時打開的文
件數, 一般n<=20。因此在使用文件前應打開文件, 才可對其中的信息進行存取。
用完之後需要關閉, 否則將會出現一些意想不到的錯誤。Turbo C2.0提供了打開
和關閉文件的函數。
1. fopen()函數
fopen函數用於打開文件, 其調用格式為:
FILE *fopen(char *filename, *type);
在介紹這個函數之;前, 先了解一下下面的知識。
(1) 流(stream)和文件(file)
流和文件 在Turbo C2.0中是有區別的, Turbo C2.0 為編程者和被訪問的設
備之間提供了一層抽象的東西, 稱之為"流", 而將具體的實際設備叫做文件。
流是一個邏輯設備, 具有相同的行為。因此, 用來進行磁碟文件寫的函數也同樣
可以用來進行列印機的寫入。在Turbo C2.0中有兩種性質的流: 文字流( text
stream)和二進制(binary stream)。對磁碟來說就是文本文件和二進制文件。本
軟體為了便於讓讀者易理解Turbo C2.0語言而沒有對流和文件作特別區分。
(2) 文件指針FILE
實際上FILE是一個新的數據類型。它是Turbo C2.0的基本數據類型的集合,
稱之為結構指針。有關結構的概念將在第四節中詳細介紹, 這里只要將FILE理解
為一個包括了文件管理有關信息的數據結構, 即在打開文件時必須先定義一個文
件指針。
(3) 以後介紹的函數調用格式將直接寫出形式參數的數據類型和函數返回值
的數據類型。例如: 上面打開文件的函數, 返回一個文件指針, 其中形式參數有
兩個, 均為字元型變數(字元串數組或字元串指針)。本軟體不再對函數的調用格
式作詳細說明。
現在再來看打開文件函數的用法。
fopen()函數中第一個形式參數表示文件名, 可以包含路徑和文件名兩部分。
如:
"B:TEST.DAT"
"C:\\TC\\TEST.DAT"
如果將路徑寫成"C:\TC\TEST.DAT"是不正確的, 這一點要特別注意。
第二個形式參數表示打開文件的類型。關於文件類型的規定參見下表。
表 文件操作類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字元 含義
————————————————————————————
"r" 打開文字文件只讀
"w" 創建文字文件只寫
"a" 增補, 如果文件不存在則創建一個
"r+" 打開一個文字文件讀/寫
"w+" 創建一個文字文件讀/寫
"a+" 打開或創建一個文件增補
"b" 二進制文件(可以和上面每一項合用)
"t" 文這文件(默認項)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果要打開一個CCDOS子目錄中, 文件名為CLIB的二進制文件, 可寫成:
fopen("c:\\ccdos\\clib", "rb");
如果成功的打開一個文件, fopen()函數返迴文件指針, 否則返回空指針
(NULL)。由此可判斷文件打開是否成功。
2. fclose()函數
fclose()函數用來關閉一個由fopen()函數打開的文件 , 其調用格式為:
int fclose(FILE *stream);
該函數返回一個整型數。當文件關閉成功時, 返回0, 否則返回一個非零值。
可以根據函數的返回值判斷文件是否關閉成功。
例10:
#iclude<stdio.h>
main()
{
FILE *fp; /*定義一個文件指針*/
int i;
fp=fopen("CLIB", "rb"); /*打開當前目錄名為CLIB的文件只讀*/
if(fp==NULL) /*判斷文件是否打開成功*/
puts("File open error");/*提示打開不成功*/
i=fclose(fp); /*關閉打開的文件*/
if(i==0) /*判斷文件是否關閉成功*/
printf("O,K"); /*提示關閉成功*/
else
puts("File close error");/*提示關閉不成功*/
}
二、有關文件操作的函數
本節所講的文件讀寫函數均是指順序讀寫, 即讀寫了一條信息後, 指針自動
加1。下面分別介紹寫操作函數和讀操作函數。
1. 文件的順序寫函數
fprintf()、fputs()和fputc()函數
函數fprintf()、fputs()和fputc()均為文件的順序寫操作函數, 其調用格
式如下:
int fprintf(FILE *stream, char *format, <variable-list>);
int fputs(char *string, FILE *steam);
int fputc(int ch, FILE *steam);
上述三個函數的返回值均為整型量。fprintf() 函數的返回值為實際寫入文
件中的字罕個數(位元組數)。如果寫錯誤, 則返回一個負數, fputs()函數返回0時
表明將string指針所指的字元串寫入文件中的操作成功, 返回非0時, 表明寫操
作失敗。fputc()函數返回一個向文件所寫字元的值, 此時寫操作成功, 否則返
回EOF(文件結束結束其值為-1, 在stdio.h中定義)表示寫操作錯誤。
fprintf( ) 函數中格式化的規定與printf( ) 函數相同, 所不同的只是
fprintf()函數是向文件中寫入。而printf()是向屏幕輸出。
下面介紹一個例子, 運行後產後一個test.dat的文件。
例11:
#include<stdio.h>
main()
{
char *s="That's good news"); /*定義字元串指針並初始化*/
int i=617; /*定義整型變數並初始化*/
FILE *fp; /*定義文件指針*/
fp=fopne("test.dat", "w"); /*建立一個文字文件只寫*/
fputs("Your score of TOEFLis", fp);/*向所建文件寫入一串字元*/
fputc(':', fp); /*向所建文件寫冒號:*/
fprintf(fp, "%d\n", i); /*向所建文件寫一整型數*/
fprintf(fp, "%s", s); /*向所建文件寫一字元串*/
fclose(fp); /*關閉文件*/
}
用DOS的TYPE命令顯示TEST.DAT的內容如下所示:
屏幕顯示
Your score of TOEFL is: 617
That's good news
2. 文件的順序讀操作函數
fscanf()、fgets()和fgetc()函數
函數fscanf()、fgets()和fgetc()均為文件的順序讀操作函數, 其調用格式
如下:
int fscanf(FILE *stream, char *format, <address-list>);
char fgets(char *string, int n, FILE *steam);
int fgetc(FILE *steam);
fscanf()函數的用法與scanf()函數相似, 只是它是從文件中讀到信息。
fscanf()函數的返回值為EOF(即-1), 表明讀錯誤, 否則讀數據成功。fgets()函
數從文件中讀取至多n-1個字元(n用來指定字元數), 並把它們放入string指向的
字元串中, 在讀入之後自動向字元串未尾加一個空字元, 讀成功返回string指針,
失敗返回一個空指針。fgetc()函數返迴文件當前位置的一個字元, 讀錯誤時返
回EOF。
下面程序讀取例11產生的test.dat文件, 並將讀出的結果顯示在屏幕上。
例12
#include<stdio.h>
main()
{
char *s, m[20];
int i;
FILE *fp;
fp=fopen("test.dat", "r"); /*打開文字文件只讀*/
fgets(s, 24, fp); /*從文件中讀取23個字元*/
printf("%s", s); /*輸出所讀的字元串*/
fscanf(fp, "%d", &i); /*讀取整型數*/
printf("%d", i); /*輸出所讀整型數*/
putchar(fgetc(fp)); /*讀取一個字元同時輸出*/
fgets(m, 17, fp); /*讀取16個字元*/
puts(m); /*輸出所讀字元串*/
fclose(fp); /*關閉文件*/
getch(); /*等待任一鍵*/
}
運行後屏幕顯示:
Your score of TOEFL is: 617
That's good news
如果將上例中fscanf(fp, "%d", &i)改為fscanf(fp, "%s", m), 再將其後
的輸出語句改為printf("%s", m), 則可得出同樣的結果。由此可見Turbo C2. 0
中只要是讀文字文件, 則不論是字元還是數字都將按其ASCII值處理。 另外還要
說明的一點就是fscanf()函數讀到空白符時, 便自動結束, 在使用時要特別注意。
3. 文件的隨機讀寫
有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機讀寫函數, 即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
文件的隨機讀寫函數如下:
int fseek (FILE *stream, long offset, int fromwhere);
int fread(void *buf, int size, int count, FILE *stream);
int fwrite(void *buf, int size, int count, FILE *stream);
long ftell(FILE *stream);
fseek()函數的作用是將文件的位置指針設置到從fromwhere開始的第offset
位元組的位置上, 其中fromwhere是下列幾個宏定義之一:
文件位置指針起始計算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
———————————————————————————
SEEK_SET 0 從文件開頭
SEEK_CUR 1 從文件指針的現行位置
SEEK_END 2 從文件末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
節數。它是一個長整型量, 以支持大於64K位元組的文件。fseek()函數一般用於對
二進制文件進行操作。
當fseek()函數返回0時表明操作成功, 返回非0表示失敗。
下面程序從二進制文件test_b.dat中讀取第8個位元組。
例13:
#include<stdio.h>
main()
{
FILE *fp;
if((fp=fopen("test_b.dat", "rb"))==NULL)
{
printf("Can't open file");
exit(1);
}
fseek(fp, 8. 1, SEEK_SET);
fgetc(fp);
fclose(fp);
}
fread()函數是從文件中讀count個欄位, 每個欄位長度為size個位元組, 並把
它們存放到buf指針所指的緩沖器中。
fwrite()函數是把buf指針所指的緩沖器中, 長度為size個位元組的count個字
段寫到stream指向的文件中去。
隨著讀和寫位元組數的增大, 文件位置指示器也增大, 讀多少個位元組, 文件位
置指示器相應也跳過多少個位元組。讀寫完畢函數返回所讀和所寫的欄位個數。
ftell()函數返迴文件位置指示器的當前值, 這個值是指示器從文件頭開始
算起的位元組數, 返回的數為長整型數, 當返回-1時, 表明出現錯誤。
下面程序把一個浮點數組以二進制方式寫入文件test_b.dat中。
例14:
#include <stdio.h>
main()
{
float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
/*定義浮點數組並初始化*/
int i;
FILE *fp;
fp=fopen("test_b.dat", "wb"); /*創建一個二進制文件只寫*/
fwrite(f, sizeof(float), 6, fp);/*將6個浮點數寫入文件中*/
fclose(fp); /*關閉文件*/
}
下面例子從test_b.dat文件中讀100個整型數, 並把它們放到dat數組中。
例15:
#include <stdio.h>
main()
{
FILE *fp;
int dat[100];
fp=fopen("test_b.dat", "rb");/*打開一個二進制文件只讀*/
if(fread(dat, sizeof(int), 100, fp)!=100)
/*判斷是否讀了100個數*/
{
if(feof(fp))
printf("End of file"); /*不到100個數文件結束*/
else
printf("Read error"); /*讀數錯誤*/
fclose(fp); /*關閉文件*/
}
注意:
當用標准文件函數對文件進行讀寫操作時, 首先將所讀寫的內容放進緩沖區,
即寫函數只對輸出緩沖區進行操作, 讀函數只對輸入緩沖區進行操作。例如向一
個文件寫入內容, 所寫的內容將首先放在輸出緩沖區中, 直到輸出緩沖區存滿或
使用fclose()函數關閉文件時, 緩沖區的內容才會寫入文件中。若無fclose()
函數, 則不會向文件中存入所寫的內容或寫入的文件內容不全。有一個對緩沖區
進行刷新的函數, 即fflush(), 其調用格式為:
int fflush(FILE *stream);
該函數將輸出緩沖區的內容實際寫入文件中, 而將輸入緩沖區的內容清除掉。
4. feof()和rewind()函數
這兩個函數的調用格式為:
int feof(FILE *stream);
int rewind(FILE *stream);
feof()函數檢測文件位置指示器是否到達了文件結尾, 若是則返回一個非0
值, 否則返回0。這個函數對二進制文件操作特別有用, 因為二進制文件中, 文
件結尾標志EOF也是一個合法的二進制數, 只簡單的檢查讀入字元的值來判斷文
件是否結束是不行的。如果那樣的話, 可能會造成文件未結尾而被認為結尾, 所
以就必須有feof()函數。
下面的這條語句是常用的判斷文件是否結束的方法。
while(!feof(fp))
fgetc(fp);
while為循環語句, 將在下面介紹。
rewind()函數用於把文件位置指示器移到文件的起點處, 成功時返回0, 否則, 返回非0值。
❸ C語言中,FILE是關鍵字嗎
FILE不是C語言關鍵字,只是標准C中的標准輸入輸出中定義的一個新的數據類型
stdio.h
typedefstruct_iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
}FILE;
FILE 主要用來定義帶緩沖的文件指針,如:FILE *fp;
附:C語言一共有32個關鍵字,如下:
auto 局部變數(自動儲存)
break 無條件退出程序最內層循環
case switch語句中選擇項
char 單位元組整型
const 定義不可更改值的變數
continue 中斷本次循環,並轉向下一次循環
default switch語句中的默認選擇項
do 用於構成do.....while循環語句
double 雙精度浮點型
else 構成if.....else選擇程序結構
enum 枚舉
extern 聲明外部全局變數
float 單精度浮點型
for 構成for循環語句
goto 跳到程序中指定的標簽位置
if 構成if....else選擇結構
int 整型
long 長整型
register 定義CPU內部寄存的變數
return 用於返回函數的返回值
short 短整型
signed 有符號數與基本整型類型結合使用
sizeof 計算表達式或數據類型的佔用位元組數
static 定義靜態變數、函數
struct 定義結構類型
switch 構成switch選擇結構
typedef 重新定義數據類型
union 聯合類型
unsigned 定義無符號數據與基本整型類型結合使用
void 定義任意類型指針void*,無參數,無返回值等
volatile 易失性變數
while 用於構成do...while或while循環結構
❹ c語言如何打開D:\Program Files (x86)文件夾
system("start C:\Progra~2"); VS2019驗證通過。
用這個函數,如果要打開的是上面那個,就用~1,如果是下面那個,用~2,如果還有更多的,就用~3,以此類推。具體原因,是DOS系統的8.3命名規則。就是說DOS系統下不支持長文件名,所以超過8位的,就取前六位字元,後面依次加~1。