該文章上一篇:C/C++文件操作(細(xì)節(jié)滿滿,part1)_仍有未知等待探索的博客-CSDN博客
個人主頁:仍有未知等待探索_C語言疑難,數(shù)據(jù)結(jié)構(gòu),小項目-CSDN博客
專題分欄:C語言疑難_仍有未知等待探索的博客-CSDN博客
目錄
?
一、引言
二、文件的順序
1、輸入流和輸出流
2、fputc
1.功能
2. 參數(shù)
3.用法
4.注意?
3、fgetc
1.功能?
2.參數(shù)
3.用法
4、fputs?
1、功能?
2、參數(shù)
3、用法
5、fgets?
?編輯?1、功能?
2、參數(shù)
3、用法
4、注意?
6、fprintf
1、功能?
2、參數(shù)
3、用法?
7、fscanf?
1、功能
2、參數(shù)
3、 用法
8、fwrite
?編輯
1、功能
2、參數(shù)
3、用法
4、注意?
9、fread?
1、功能
2、參數(shù)
3、用法
4、注意?
三、文件的隨機讀寫
1、fseek
2、ftell?
3、rewind?
四、二進(jìn)制文件和文本文件
五、文件讀取結(jié)束的標(biāo)志
1、文本文件讀取結(jié)束標(biāo)志
2、二進(jìn)制文件讀取結(jié)束標(biāo)志
六、文件緩沖區(qū)
?
一、引言
通過上篇文章,已經(jīng)了解了什么是文件、打開和關(guān)閉文件的操作,流的概念等。
如果對于上述的內(nèi)容感到有點陌生了,不妨去看一看,文章鏈接在開頭。
這篇文章的內(nèi)容將會包含寫文件的基本操作。
文件的順序讀寫:是每次從第一個字符開始讀和寫。
文件的隨機讀寫:是每次可以從任意一個位置讀和寫。
二、文件的順序
適用文件 | 功能 | 函數(shù)名 | 適用于 |
文本文件 | 字符輸入函數(shù) | fgetc | 所有輸入流 |
文本文件 | 字符輸出函數(shù) | fputc | 所有輸出流 |
文本文件 | 文本行輸入函數(shù) | fgets | 所有輸入流 |
文本文件 | 文本行輸出函數(shù) | fputs | 所有輸出流 |
文本文件 | 格式化輸入函數(shù) | fscanf | 所有輸入流 |
文本文件 | 格式化輸出函數(shù) | fprintf | 所有輸出流 |
二進(jìn)制文件 | 二進(jìn)制輸入 | fread | 文件 |
二進(jìn)制文件 | 二進(jìn)制輸出 | fwrite | 文件 |
1、輸入流和輸出流
流相當(dāng)于是一個過渡的過程。怎么判上述函數(shù)是輸入流還是輸出流呢?
我們可以站在內(nèi)存的視角來看,如果是數(shù)據(jù)流向內(nèi)存,我們就可以看作是輸入流。反之,則是輸出流。
就以fgetc和fputc為例:
2、fputc
1.功能
將一個字符character寫進(jìn)stream流中。
2. 參數(shù)
character:字符(字符的本質(zhì)就是ASCII碼值,是整數(shù))。
stream:文件指針。
3.用法
#include<stdio.h>
int main()
{
//以‘只寫’的方式打開文件
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
//輸入
for (int i = 'a'; i <= 'z'; i++)
fputc(i, pf);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4.注意?
用什么方式打開文件就只能完成該功能。就比如說,以‘只寫’的方式打開文件,就不能進(jìn)行讀取操作。
如果對于打開方式模糊了,請點擊下面鏈接,查看上一篇的內(nèi)容:
C/C++文件操作(細(xì)節(jié)滿滿,part1)_仍有未知等待探索的博客-CSDN博客
3、fgetc
1.功能?
?從stream流中獲取數(shù)據(jù)。
2.參數(shù)
文件指針類型的stream流。
3.用法
如果獲取失敗,函數(shù)將返回EOF
//以‘只讀’的方式打開文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
//輸出
int ch;
while((ch=fgetc(pf))!=EOF)
{
printf("%c ",ch);
}
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4、fputs?
1、功能?
將一個字符串寫入流中。
2、參數(shù)
str:需要寫入文件的參數(shù)。
stream:文件流。
3、用法
如果沒有‘\n’的話,他會把數(shù)據(jù)輸入在一行。?
如果把文件指針pf換成stdout的話,程序會把數(shù)據(jù)打印在屏幕上。
#include<stdio.h>
int main()
{
//以‘只寫’的方式打開文件
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
fputs("abcd", pf);//不換行寫法
fputs("abcd\n", pf);//換行寫法
fputs("abcd", stdout);//將數(shù)據(jù)打印在屏幕上
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
5、fgets?
?1、功能?
從流中獲取字符串。
2、參數(shù)
str:字符串。
num:讀取的個數(shù)。
stream:文件流。
3、用法
如果獲取失敗,函數(shù)將返回EOF
#include<stdio.h>
int main()
{
//以‘只讀’的方式打開文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
char str[20];
fgets(str, 10, pf);
printf("%s", str);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4、注意?
- 函數(shù)最多只會讀取一行的數(shù)據(jù)。
- 當(dāng)數(shù)據(jù)足夠多時,參數(shù)為num,函數(shù)只會讀取num-1個數(shù)據(jù)。
6、fprintf
1、功能?
將格式化數(shù)據(jù)寫入文件流中。
2、參數(shù)
通過將fprintf和printf的參數(shù)相比較,會發(fā)現(xiàn),fprintf的參數(shù)就比printf的參數(shù)多了一個文件指針。?
3、用法?
#include<stdio.h>
struct S
{
float f;
char ch;
int n;
};
int main()
{
struct S s = { 4.14f,'w',1 };
//以‘只 寫’的方式打開文件
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
printf("%f %c %d\n", s.f, s.ch, s.n);
fprintf(pf,"%f %c %d\n", s.f, s.ch, s.n);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
7、fscanf?
1、功能
從流中讀取數(shù)據(jù)。
2、參數(shù)
fscanf和scanf的參數(shù)差不多,多了一個文件流stream。
3、 用法
#include<stdio.h>
struct S
{
float f;
char ch;
int n;
};
int main()
{
struct S s = { 4.14f,'r',1 };
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
fscanf(pf, "%f %c %d", &(s.f), &(s.ch), &(s.n));
printf("%f %c %d", s.f, s.ch, s.n);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
8、fwrite
1、功能
將ptr中的數(shù)據(jù)寫入流中,大小為size,個數(shù)為count。
2、參數(shù)
ptr:指向要寫入文件流中的數(shù)據(jù)的指針。
size:每個數(shù)據(jù)的大小。
count:數(shù)據(jù)個數(shù)。
stream:要寫入的文件流中。
3、用法
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "wb");//abcdef
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
char str[] = "abcd";
fwrite(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4、注意?
文件的打開方式要和函數(shù)匹配,要用二進(jìn)制的寫的方式。
9、fread?
1、功能
從文件流中讀取數(shù)據(jù)。
2、參數(shù)
ptr:指向文件流中的數(shù)據(jù)所要存到的位置的指針。
size:每個數(shù)據(jù)的大小。
count:數(shù)據(jù)個數(shù)。
stream:文件流。
3、用法
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "rb");//abcdef
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
char str[20];
fread(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
printf("%s", str);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
4、注意?
文件的打開方式要和函數(shù)匹配,要用二進(jìn)制的讀的方式。
三、文件的隨機讀寫
根據(jù)文件指針的位置和偏移量來確定文件指針的位置。
SEEK_SET | Beginning of file |
SEEK_END | Current position of the file pointer |
SEEK_CUR | End of file |
1、fseek
?功能是改變文件指針的位置。
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");//abcdef
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
int ch;
ch = fgetc(pf);//a
printf("%c\n", ch);
ch = fgetc(pf);//b
printf("%c\n", ch);
ch = fgetc(pf);//c
printf("%c\n", ch);
fseek(pf, -1, SEEK_CUR);
ch = fgetc(pf);
printf("%c\n", ch);//c
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
2、ftell?
功能是返回文件當(dāng)前指針的偏移量。
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");//abcdef
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
int ch;
ch = fgetc(pf);//a
printf("%c\n", ch);
ch = fgetc(pf);//b
printf("%c\n", ch);
ch = fgetc(pf);//c
printf("%c\n", ch);
int pos = ftell(pf);
printf("%d", pos);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
3、rewind?
功能是將文件指針返回起始位置。
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");//abcdef
if (pf == NULL)
{
perror("fopen");
return 0;
}
//處理
int ch;
ch = fgetc(pf);//a
ch = fgetc(pf);//b
ch = fgetc(pf);//c
int pos = ftell(pf);
printf("%d\n", pos);
rewind(pf);
pos = ftell(pf);
printf("%d", pos);
//關(guān)閉文件
fclose(pf);
pf = NULL;
return 0;
}
四、二進(jìn)制文件和文本文件
根據(jù)數(shù)據(jù)的存儲形式,文件可以分為二進(jìn)制文件和文本文件。
數(shù)據(jù)在文件中以二進(jìn)制存儲,就是二進(jìn)制文件。
數(shù)據(jù)在文件中以ASCII碼值存儲,就是文本文件。
五、文件讀取結(jié)束的標(biāo)志
在文件讀取過程中,不能用feof函數(shù)的返回值直接用來判斷文件的是否結(jié)束。
1、文本文件讀取結(jié)束標(biāo)志
fgetc——判斷是否為EOF
fgets——判斷是否為NULL
2、二進(jìn)制文件讀取結(jié)束標(biāo)志
fread——判斷返回值是否小于實際要讀的個數(shù)。
六、文件緩沖區(qū)
文章來源:http://www.zghlxwxcb.cn/news/detail-714251.html
謝謝大家支持!?文章來源地址http://www.zghlxwxcb.cn/news/detail-714251.html
到了這里,關(guān)于C/C++文件操作(細(xì)節(jié)滿滿,part2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!