无论是在C语言中还是在Python中,对文件的操作都是直接实现了计算机内部与外部之间的交互;
通过将数据写入文件可以更好地实现数据的储存,而不会在程序结束之后数据随之消失,
而通过文件的读取操作则可以更好地避免自己讲大量数据的手动输入程序。
本篇文章主要介绍C语言以及Python中基本的对文件的操作,
旨在可以通过类比来达到更好的理解两种不同语言中的同种操作的不同语法的目的,
相比较而言每种方式都有每种方式的长处与短板,无非好坏。
一:C语言中的对文件的操作
主要介绍以下函数:
★fopen(path,model) + fclose(FILE*fp)
★fgetc(FILE*fp) + fputc(char c,FILE*fp)
★fgets(char *a,n,FILE *fp) + fputs(char *str,FILE *fp)
1)文件的打开与关闭
FILE 是一个结构体指针变量,首先自定义一个文件类型变量:FILE *fp (file point文件指针)
然后通过fopen()打开文件返回指针存进自定义的FILE变量中,
紧接着可以使用一系列已给出的函数对该文件类型的指针进行操作来实现文件的读取与存储,
最后需要关闭文件(这一步不可省略,举个例子:当你首先以write模式打开一个文件,在没有关闭该文件的情况下如果再次通 过read模式打开该文件,那么就会无法读取到任何东西,然而在python中就有相应的语句可以不用手动输入文件结束语句)
下面附上文件的打开(fopen)与关闭(fclose)的代码:
#include
#include
int main()
{
FILE *fp,*fp1;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","rb")))
{
printf("Open file error!\n");
exit(0);
}
else
{
printf("Open Success! ");
}
fclose(fp);
return 0;
}
文件的打开函数fopen()需要传入两个参数,其函数原型为:FILE * fopen(const char * path, const char * mode)
第一个参数是需要打开的文件目录,第二个参数是需要以什么样的方式打开文件:
最常用的打开文件的几种方式:
1> r :read 以只读方式读取文件,在该模式下不允许写入文件的操作,该文件必须存在,如果不存在不会创建新文件;
2>w :write 打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件;
3>w+:write+ 打开可读/写文件,其余与w一致,会自动创建不存在的文件;
4>a :add 追加模式(打开只写文件),在文件的后方进行数据添加(原先的EOF结束符保留),若文件不存在,会建立该文件;
5>a+ :add+ 追加模式(打开可读/写文件),在文件的后方进行数据添加(原先的EOF结束符被清除),也会建立不存在的文件;
2)文件的单个字符存取(fgetc()+fputc()) -> (file_getchar+file_putchar)
读取操作函数原型:fgetc(FILE*fp)
//fgetc()函数的使用举例
#include
#include
int main()
{
FILE *fp,*fp1;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","r")))
{
printf("Open file error!\n");
exit(0);
}
//原文本文件中存有数据:123456789
char ch;
ch = fgetc(fp);
printf("%c",ch);
printf("%c",ch);
printf("%c",ch);
//输出结果为:111
printf("\n");
//比较下面的输出与上面不同的原因
ch = fgetc(fp);
printf("%c",ch);
ch = fgetc(fp);
printf("%c",ch);
ch = fgetc(fp);
printf("%c",ch);
//输出结果为:234
fclose(fp);
return 0;
}
写入操作函数原型:fputc(char c,FILE*fp)
检查一下下面的代码,思考有没有什么错误?
//fputc()函数的使用举例
#include //getchar()函数在这里面
#include //包含exit()函数
int main()
{
FILE *fp,*fp1;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w"))) //这里更换打开模式为write
{
printf("Open file error!\n");
exit(0);
}
//原文本文件中存有数据:123456789
fputc('1',fp);
//下面循环读取数据进行显示
char ch = fgetc(fp);
while(ch!=EOF) //EOF?下面会讲到
{
putchar(ch);//在函数库stdio.h中
ch = fgetc(fp);
}
fclose(fp);
return 0;
}
没看出来?
★错误在于第一次向文件中写数据的时候,文件没有关闭,而且第二次再次对文件进行不同操作的时候没有声明文件打开方式为read。
下面稍作修改:
//fputc()函数的使用举例
#include //getchar()函数在这里面
#include //包含exit()函数
int main()
{
FILE *fp,*fp1;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w"))) //这里更换打开模式为write
{
printf("Open file error!\n");
exit(0);
}
//原文本文件中存有数据:123456789
fputc('1',fp);
//下面循环读取数据进行显示(这个时候文件中只有一个数据:1)
fclose(fp);
//操作方式改变的时候需要再次声明打开方式再进行操作
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","r"))) //这里更换打开模式为read
{
printf("Open file error!\n");
exit(0);
}
char ch = fgetc(fp);
while(ch!=EOF) //EOF?下面会讲到
{
putchar(ch);//在函数库stdio.h中
ch = fgetc(fp);
}
fclose(fp);
return 0;
}
EOF马上在后面就会提到,这里先思考怎样通过循环将一连串字符输入文件呢?(答案见下面)
#include //getchar()在这个库文件中
#include //exit()
#include //getch()
int main()
{
FILE *fp;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w")))
{
printf("Open file error!\n");
exit(0);
}
char ch;
do
{
//ch = getch(); //不回显
ch = getchar(); //回显
fputc(ch,fp);
}while(ch!=' '); //输入空格停止循环读取
fclose(fp);
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","r")))
{
printf("Open file error!\n");
exit(0);
}
ch = fgetc(fp);
while(ch!=EOF)
{
putchar(ch);//在库文件stdio.h中
ch = fgetc(fp);
}
fclose(fp);
return 0;
}
★Addition:EOF?
简单来说EOF是一个宏定义:#define EOF -1,在这里起到用来结束文件的作用。
不明白的话我来举个例子:
如果你想通过输入单个字符来循环写入文件一些数据,那么当自己不想输入的时候应该怎么办呢?
是不是首先想到了设置一个标识符,当输入的字符遇到这个字符就会返回,当然这也是可以的,
但是再深入想一想:在C语言中程序在读取文件的时候是如何判断文件什么时候截止呢?这就涉及到了EOF结束标记,该标记位于文件的末尾处,下面通过代码看一下如何使用:
#include
#include
int main()
{
FILE *fp;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w")))
{
printf("Open file error!\n");
exit(0);
}
char ch;
while((ch=getchar())!=EOF)
{
fputc(ch,fp);
}
return 0;
}
这里在输入截止的时候换行在新的一行开头按下:Ctrl+z 即可输入EOF表示文件截止;
在读取文件的时候也可以按照这个方法来进行判断文件是不是结束了(就像最初提到EOF的那个demo一样)。
★这里再提一下中文编码的识别乱码问题:
一个很好的解决办法是直接修改本地文件的编码为ANSI (可以通过Notepad++记事本修改)
具体关于ANSI编码可以参考另一篇博主的文章:https://blog..net/xiangxianghehe/article/details/77574965
3)实现字符串的存取(fgets()+fputs())
1>读取函数原型:int fgets(char *a,n,FILE *fp) -> 读取n-1个字符
参数解读:
第一个参数是需要存读取到的数据的一个数组指针,需要读取的文件在第三个参数位置指明,第二个参数值指明读取字符的数量。
★在读取字符串的时候遇到换行符时函数会返回NULL,可以通过这一点来对每行进行操作,例如将一个文件中的信息按照每行读取的方式写入另一个文件。
while(fgets(buffer,512,fp)!=NULL)
printf("%s\n",buffer);
//这个循环每读取到一个换行符的时候就会执行循环内部的语出,输出换行之前读取到的字符串
* buffer 缓冲区(只是借用这个单词定义变量名)
2>写入函数原型:int fputs(char *str,FILE *fp)
#include
#include
int main()
{
FILE *fp;
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w")))
{
printf("Open file error!\n");
exit(0);
}
fputs("12121",fp);
printf("Write Complete!");
fclose(fp);
return 0;
}
3>将一个文件中的信息粘贴到另一个文件中
//将一个文件中的信息以附加方式存到另一个文件中
#include
#include
#include
#define SIZE 512
int main()
{
FILE *fp,*fp1;
char buffer[SIZE];
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","w")))
{
printf("Open file error!\n");
exit(0);
}
char ch;
printf("Input Data: \n");
do
{
//ch = getch(); //不回显
ch = getchar(); //回显
fputc(ch,fp);
}while(ch!=' '); //输入空格停止循环读取
fclose(fp);
if(!(fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","r")))
{
printf("Open file error!\n");
exit(0);
}
printf("\nTraverse Data: \n");
ch = fgetc(fp);
while(ch!=EOF)
{
putchar(ch);//在库文件stdio.h中
ch = fgetc(fp);
}
printf("\n");
fclose(fp);
fp = fopen("C:\\Users\\dell\\Desktop\\Python\\test.txt","r");
//while(fgets(buffer,SIZE,fp)!=NULL)
// printf("%s\n",buffer); //第一次读取一遍过后可以理解为fp中的读取位置已经到了最后,再次读取将不会读取到任何数据
fp1 = fopen("C:\\Users\\dell\\Desktop\\Python\\test1.txt","a");
while(fgets(buffer,SIZE,fp)!=NULL)
fputs(buffer,fp1);
fclose(fp);
fclose(fp1);
printf("Add-copy Complete!");
return 0;
}
二:Python中对文件的操作
1)文件的打开file.open()+文件的关闭file.close()+文件的读取file.read()+文件的写入file.write()
1>在python中可以直接使用open()函数进行文件的打开与编码方式的指定:
file = open("C:\\Users\\dell\\Desktop\\Python\\test.txt","w",encoding="utf-8")
各个参数的含义几乎与C语言中的一致,最后一个参数是指定编码格式为UTF-8;
这里如果没有指定编码格式,默认为:encoding='cp936' (code page 936 -> GBK)
★encode:编码 decode:解码
2>这里的file类型我们来查看一下:
print(type(file))
结果: 文本输入输出流(可以通过相应的read()函数进行读取)
3>文本的读取:
file.read() #默认文件数据为:123abc
=> 如果文件中有换行的话换行符会被转换为\n输出!
结果:'123abc'
4>文本的写入:
f.write("124578\n454578414")
=> 那么这里的\n是否会被识别为换行符呢?=>答案是会被识别为换行
2)不手动使用file.close()的语句
with open("C:\\Users\\dell\\Desktop\\Python\\test1.txt","w",encoding="utf-8") as file:
file.write("457878")
=> 注意冒号!
3)循环操作读取的数据(使用到自定义操作函数process())
f = open("C:\\Users\\dell\\Desktop\\Python\\test.txt",encoding="utf-8")
char = f.read(1)
while(char):
process(char)
char = f.read(1)
f.close()
专题:【Python文件】
最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。