c語言文件讀取方面?1、文件的分類:文件分為兩大類,一類是磁盤文件一類是設備文件,下面我們就來聊聊關于c語言文件讀取方面?接下來我們就一起去了解一下吧!
1、文件的分類:
文件分為兩大類,一類是磁盤文件一類是設備文件。
磁盤文件:指一組相關數據的介質,通常存儲在外部介質上,使用時才調入内存。
設備文件:在操作系統中把每一個與主機相連的輸入、輸出設備看做是一個文件,把他們的輸入、輸出等同于對自盤文件的讀和寫。
1.1磁盤文件的分類
磁盤文件分為兩大類分别是文本文件和二進制文件
文本文件:基于字符編碼的文件;基于字符編碼,常見編碼有ASCII、UNICODE等
一般可以使用文本編輯器直接打開。
二進制文件:基于值編碼的文件;自己根據具體應用,指定某個值是什麼意思
把内存中的數據按其在内存中的存儲形式原樣輸出到磁盤上。
2、文件的打開和關閉
2.1文件指針file
在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針
FILE是系統typedef定義出來的有關文件信息的一種結構體類型,結構中含有
文件名、文件狀态和文件當前位置等信息。
#include<stdio.h>
FILE* fopen(const char* filename,const char* mode)
功能:打開文件
參數: filename:需打開的文件名,根據需要添加路徑
mode:打開文件的模式設置
返回值: 成功:文件指針
失敗:NULL
參數二mode的幾種形式:
r或者rb:以隻讀方式打開一個文本文件(不創建文件,若文件不存在則報錯)
w或wb:以寫的方式打開(如果文件存在則清空文件,文件不存在則創建一個文件)
a或者ab:以追加的方式打開文件,在末尾添加内容,若文件不存在則創建文件
r 或者rb :以可讀、可寫的方式打開文件(不創建新文件)
w 或wb :以可讀、可寫的方式打開文件(如果文件存在則清空文件,文件不存在則創建一個文件)
a 或者ab :以添加方式打開文件,打開文件并在末尾更改文件,若文件不存在則創建文件
打開的文件會占用内存資源,如果總是打開不關閉,會消耗很多内存。
一個進程同時打開的文件數是有限制的,超過最大同時打開文件數,在此調用fopen打開會失敗
如果沒有明确調用fclose關閉打開的文件,那麼程序在退出的時候,操作系統會統一關閉。
#include<>stdio.h
int fclose(FILE * stream);
功能:關閉先前fopen()打開的文件。此動作讓緩沖區的數據寫入文件中,并釋放系統所提供的文件資源
參數: stream:文件指針
返回值: 成功 0
失敗 -1
3、文件字符、行讀寫:
fgetc()、fputc()
①寫文件: #include<stdio.h>
int fputc(int ch,FILE * stream);
功能: ch:需要寫入文件的字符;
stream:文件指針
返回值: 成功:成功寫入文件的字符
失敗:返回 -1
③讀文件:
#include<stdio.h>
int fgetc(FILE*stream);
功能: 從stream指定的文件中讀取一個字符
參數: stream:文件指針
返回值: 成功:返回讀取到的字符
失敗:-1
②fEOF(): #include<stdio.h>
int feof(FILE*stream);
功能: 檢測是否讀取到了文件結尾。判斷的是最後一次“讀操作的内容”,不是當前位置内容
參數: stream:文件指針
返回值: 非0值:已經到文件結尾
0:未到文件結尾
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main0201()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
{
printf("文件打開失敗\n");
return -1;
}
char ch;
//文件的字符讀取
//文件默認結尾為-1
ch = fgetc(fp);
printf("%c\n", ch);
//fp ;//err 不能修改文件指針 文件在讀取中光标流會自動向下移動
ch = fgetc(fp);
printf("%c\n", ch);
ch = fgetc(fp);
printf("%c\n", ch);
ch = fgetc(fp);
printf("%c\n", ch);
fclose(fp);
return 0;
}
int main0202(void)
{
FILE* fp = fopen("F:/a.txt", "r");//以讀的方式打開文件
if (!fp)
{
return -1;
}
char ch;
while ((ch = fgetc(fp))!=EOF)
{
printf("%c", ch);
}
fclose(fp);
}
int main0203(void)
{
//以寫的方式打開文件 若文件不存在 會創建一個新文件 若文件存在将清空内容
FILE* fp = fopen("F:/b.txt", "w");
if (!fp)
{
return -1;
}
char ch = 'a';
fputc(ch, fp);
fclose(fp);
return 0;
}
int main0204(void)
{
FILE* fp = ("D:/a.c", "w");
if (!fp)
{
printf("文件打開失敗\n");
return -1;
}
char ch;
while (1)
{
scanf("%c", &ch);
if (ch == '@')
{
break;
}
fputc(ch, fp);
}
fclose(fp);
return 0;
}
①寫文件 fputs
#include<stdio.h>
int fputs(const char* str,FILE* stream);
功能: 将str所指定的字符串寫入到stream指定的文件中,字符串結束符‘\0’不寫入文件。
參數: str:字符串
stream:文件指針
返回值: 成功:0
失敗:-1
②讀文件 fgets
#include<stdio.h>
char * fgets(char * str , int size , FLIE * stream);
功能:從stream指定的文件内讀入字符,保存到str所指定的内存空間,直到出現換行
字符、讀到文件結尾或已讀了size-1個字符為止,最後會自動加上字符‘\0’作為字符串結束
參數: str:字符串
size:指定最大讀取字符串的長度(size-1)
stream:文件指針,如果鍵盤輸入的字符串,固定寫為stdin
返回值: 成功:成功讀取的字符串
讀到文件尾或出錯:NULL
四則運算練習
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
enum opt//枚舉
{
add,sub,mlt,dive
};
int main05()
{
srand((size_t)time(NULL));//添加随機數種子
FILE* fp = fopen("F:/四則運算.txt", "w");
if (!fp)
return -1;
int a, b;
char c;
char* p = (char*)malloc(sizeof(char) * 20);
for (int i = 0; i < 100; i )
{
a = rand() 1;// 随機的數字是0~9 再 1是1~10
b = rand() % 10 1;
switch (rand()%4)
{
case add:c = ' ';break;
case sub:c = '-';break;
case mlt: c = '*';break;
case dive: c= '/';break;
}
memset(p, 0, 20);
sprintf(p, "%d%c%d=\n", a, c,b);
fputs(p, fp);
}
free(p);
fclose(fp);
//p = NULL;
//fp = NULL;
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main06()
{
FILE* fp1 = fopen("F:/四則運算.txt", "r");
FILE* fp2 = fopen("F:/四則運算結果.txt", "w");
if (!fp1 || !fp2)
{
printf("打開文件失敗\n");
return -1;
}
//!feof(fp);文本文件和二進制文件均可判斷是否為結尾 EOF僅用于文本文件
int a, b, sum;
char c;
char* p = (char*)malloc(sizeof(char) * 20);
for (int i = 0; i < 100; i )
{
memset(p, 0, 20);
fgets(p, 20, fp1);
sscanf(p,"%d%c%d=\n", &a, &c, &b);
switch (c)
{
case' ':sum = a b; break;
case'-':sum = a - b; break;
case'*':sum = a * b; break;
case'/':sum = a / b; break;
}
memset(p, 0, 20);
sprintf(p, "%d%c%d=%d\n", a, c, b, sum);
fputs(p, fp2);
}
free(p);
fclose(fp1);
fclose(fp2);
return 0;
}
4、文件格式化讀寫
fprintf()、fscanf()
①寫文件 fprintf()
#include<stdio.h>
int fprintf(FILE*stream,const char *format,...);
功能: 根據參數format字符串來轉換并格式化數據,然後将結果輸出到stream指定文件中,指定
出現字符串結束符‘\0’為止
參數: stream:已打開的文件
format:字符串格式,用法和printf()一樣
返回值: 成功:實際寫入文件的字符個數
失敗:-1
②讀文件 fscanf()
#include<stdio.h>
int fscanf(FILE * stream,const char * format,...);
功能: 從stream指定的文件讀取字符串,并根據參數format字符串來轉換并格式化數據。
參數: stream:已打開的文件
format:字符串格式,用法和scanf()一樣
返回值: 成功:參數數目,成功轉換的值的個數
失敗:-1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main0701()//fscanf()從文件中獲取寫入數據
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char) * 100);
int a;
fscanf(fp, "%d", &a);
printf("%d\n",a);
fscanf(fp, "%s", p);
printf("%s", p);
fclose(fp);
free(p);
return 0;
}
int main0702(void)
{
FILE* fp = fopen("F:/b.txt", "r");
if (!fp)
return -1;
//int a, b, c;
//fscanf(fp, "%d %d=%d", &a, &b, &c);
//char ch[20] = {0};//初始化為0
//memset(fp,0,20);//同上初始化
//fscanf(fp, "%[^\n]", ch);//正則表達式 讀取到空格
//fscanf(fp, "c", ch);
//printf("%s\n", ch);
//printf("%d\n%d\n%d\n", a, b, c);
int a;
fscanf(fp, "%x", &a);
printf("%d\n", a);
fclose(fp);
return 0;
}
int main0703(void)
{
FILE* fp = fopen("f:/b.txt", "w");
if (!fp)
return -1;
//char ch[] = "hello world";
//fprintf(fp, "%s", ch);
int a = 10;
fprintf(fp, "x", a);
fclose(fp);
}
int main0704(void)
{
srand((size_t)time(NULL));
FILE* fp = fopen("f:/四則運算.txt", "w");
if (!fp)
return -1;
int a, b;
char c;
for (int i = 0; i < 100; i )
{
a = rand() % 10 1;
b = rand() % 10 1;
switch (rand()%4)//rand()%4 随機0~3的數字
{
case 0:c = ' '; break;
case 1:c = '-'; break;
case 2:c = '*'; break;
case 3:c = '/'; break;
}
fprintf(fp, "%d%c%d=\n", a, c, b);
}
fclose(fp);
}
int main0705(void)
{
FILE* fp1 = fopen("F:/四則運算.txt","r");
FILE* fp2 = fopen("F:/四則運算結果.txt","w");
if (!fp1 || !fp2)
{
printf("文件打開失敗\n");
return -1;
}
int a, b,sum;
char c;
for (int i = 0; i < 100; i )
{
fscanf(fp1, "%d%c%d=\n", &a, &c, &b);
switch (c)
{
case' ':sum = a b; break;
case'-':sum = a - b; break;
case'*':sum = a * b; break;
case'/':sum = a / b; break;
}
fprintf(fp2, "%d%c%d=%d\n", a, c, b, sum);
}
fclose(fp1);
fclose(fp2);
}
大文件排序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main08()
{
srand((size_t)time(NULL));
FILE* fp = fopen("f:/數據.txt", "w");
if (!fp)
return -1;
for (int i = 0; i < 1000; i )
{
fprintf(fp, "%d\n", rand() % 256);
}
fclose(fp);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
void Bubble_Sort(int * arr, int len)
{
for (int i = 0; i < len - 1; i )
{
for (int j = 0; j < len - i - 1; j )
{
if (arr[j] > arr[j 1])
{
int temp = arr[j];
arr[j] = arr[j 1];
arr[j 1] = temp;
}
}
}
}
int main0901()
{
FILE* fp1 = fopen("F:/數據.txt", "r");
FILE* fp2= fopen("F:/數據冒泡排序版.txt", "w");
if (!fp1 || !fp2);
return -1;
//冒泡排序法
int* arr = (int*)malloc(sizeof(int) * 1000);
for (int i = 0; i < 1000; i )
{
fscanf(fp1, "%d\n", &arr[i]);
}
Bubble_Sort(arr, 1000);
for (int i = 0; i < 1000; i )
{
fprintf(fp2, "%d\n", arr[i]);
}
free(arr);
fclose(fp1);
fclose(fp2);
return 0;
}
int main0902()
{
FILE* fp1 = fopen("F:/數據.txt", "r");
FILE* fp2 = fopen("F:/數據插入版.txt", "w");
if (!fp1 || !fp2);
return -1;
int* arr = (int*)malloc(sizeof(int) * 256);
memset(arr, 0, sizeof(int) * 256);
for (int i = 0; i < 1000; i )
{
int value;
fscanf(fp1, "%d\n", &value);
arr[value] ;//将數據的個數放在隊形的下标裡
}
for (int i = 0; i < 256; i )
{
for (int j = 0; j < arr[i]; j )
{
fprintf(fp2, "%d\n", i);
}
}
free(arr);
fclose(fp1);
fclose(fp2);
}
5、文件塊讀寫
fread()、fwrite()
①寫文件 fwrite
#include<stdio.h>
size_t fwrite(const void * ptr , size_t size , size_t nmemb,FILE * stream);
功能: ptr:準備寫入文件數據的地址
參數: size:size_t為unsigned int類型,此參數指定寫入文件内容的塊數據大小
nmemb:寫入文件袋 塊數據,寫入文件數據總大小為:size * nmemb
stream:已經打開的文件指針
返回值: 成功:實際成功寫入文件數據的塊數目,此值和nmemb相等
失敗:0
②讀文件 fread
#include<stdio.h>
size_t fread(void * ptr , size_t size , size_t nmemb , FILE * stream);
功能: 以數據塊的方式從文件中讀取内容
參數: ptr:存放讀取出來數據的内存空間
size:size_t為unsigned int類型,此參數指定讀取文件内容的塊數據大小
nmemb:讀取文件的塊數,讀取文件數據總大小為:size * nmemb
返回值: 成功:實際成功讀取到内容的塊數,蜀國此值比nmemb小,
但大于0,說明讀到文件結尾
失敗:0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main10_01()//fwrite(寫入文件地址,sizeof(類型),元素個數,寫入文件指針)函數
{
FILE* fp = fopen("F:/c.txt", "wb");
if (!fp)
return -1;
//int a = 5678;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
fwrite(arr, sizeof(int), 10, fp);
fclose(fp);
return 0;
}
int main10_02(void)//fread()函數
{
FILE* fp = fopen("f:/c.txt", "rb");
if(!fp)
return -1;
//int value;
//fread(&value, sizeof(int), 1, fp);
int arr[10] = { 0 };
fread(arr, sizeof(int), 10, fp);
for (int i = 0; i < 10; i )
{
printf("%d\n", arr[i]);
}
fclose(fp);
return 0;
}
6、文件讀寫結構體
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
typedef struct student
{
char name[21];
int age;
int score;
char addr[51];
}stu;
int main11_01()
{
stu ss[3] =
{
{"陳勝",22,10,"北京市"},
{"吳廣",25,15,"昌平"},
{"胡海",15,20,"海澱"},
};
FILE* fp = fopen("d:/d.txt", "wb");
if (!fp)return -1;
for (int i = 0; i < 3; i )
{
fwrite(&ss[i], sizeof(stu), 1, fp);
}
fclose(fp);
return 0;
}
int main(void)
{
FILE* fp = fopen("d:/d.txt", "rb");
if (!fp)return -1;
stu* ss = (stu*)malloc(sizeof(stu) * 3);
int i = 0;
while (!feof(fp))
{
fread(&ss[i], sizeof(stu), 1, fp);
i ;
}
for (int i = 0; i < 3; i )
{
printf("姓名:%s\n", ss[i].name);
printf("年齡:%d\n", ss[i].age);
printf("分數:%d\n", ss[i].score);
printf("地址:%s\n", ss[i].addr);
}
free(ss);
fclose(fp);
return 0;
}
//文件的随機讀寫
#include<stdio.h>
int fseek(FILE * stream , long offset , int whence);
功能: 移動文件流(文件光标)的讀寫位置
參數: stream:已經打開的文件指針
offset:根據whence來移動的位移數(偏移量),可以是正數,也可以是負數,如果是正數
則上對于whence往右移,如果是負數,則相對于whence往左移。如果向前移的字節數超過
了文件開頭則出錯返回,如果向後移動的字節數超過了文件末尾,再此寫入時将增大文件尺寸。
whence:其取值如下:
SEEK_SET:從文件開頭移動offse個字節
SEEK_CUR:從當前位置移動offset個字節
SEEK_END:從文件末尾移動offset個字節
返回值: 成功:0
失敗:-1
7、獲取文件狀态
①stat
#include<sys/types.h>
#include<sys/stat.h>
int stat(const char * path , struct stat * buf);
功能: path:文件名
buf:保存文件信息的結構體
返回值: 成功:0
失敗:-1
②ftell
#include<stdio.h>
long ftell(FILE * stream);
功能: stream:已經打開的文件指針
返回值: 成功:當前文件流(文件光标)的讀寫位置
失敗:-1
③rewind
#include<stdio.h>
void rewind(FILE * stream)
功能: 把文件流(光标流)的讀寫位置移動到文件開頭
參數: stream:已經打開的文件指針
返回值: 無返回值
8、删除文件、重命名文件名
①remove
#include<stdio.h>
int remove(const char * pathname);
功能: 删除文件
參數: pathname:文件名
返回值: 成功:0
失敗:-1
②rename
#include<stdio.h>
int rename(const char * oldpath,const char * newpath);
功能: 把oldpath的文件名改為newpath
參數: oldpath:舊文件名
newpath:新文件名
返回值: 成功:0
失敗:-1
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!