1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 用C语言读写文本文件

用C语言读写文本文件

时间:2022-08-23 12:43:10

相关推荐

用C语言读写文本文件

本节主要讨论如何使用C语言读写文本文件。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔

叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。

1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用

2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程

3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

在C语言里,操作一个文件的过程分为如下四步:①定义文件指针;②使用fopen()函数打开文件;③进行文件读写操作;④关闭文件。

我们通过下述示例来介绍上述过程。

//Project - CreateSquareTable#include <stdio.h>#include <unistd.h>int main(){char sPath[512];if (getcwd(sPath,512)!=NULL) //获取并打印当前工作路径printf("Current working directory: %s\n",sPath);FILE *fp = NULL;if ((fp=fopen("SquareTable.txt","wt"))==NULL){printf("File open error - SquareTable.txt.\n");return -1;//返回非零值表示程序出错}fprintf(fp,"%6s%14s\n","N","N^2");fputs("--------------------\n",fp);for (int n=1;n<=20;n++){fprintf(fp,"%6d%14d\n",n,n*n);}if (fclose(fp)!=0){printf("File close error - SquareTable.txt.\n");return -1;}printf("File created & writed successfully: %s/SquareTable.txt",sPath);return 0;}

在作者的计算机上,上述程序的执行结果为:

Current working directory: D:\C2Cpp\C20_FileIO\build-CreateSquareTable-Desktop_Qt_5_14_1_MinGW_64_bit-DebugFile created & writed successfully: D:\C2Cpp\C20_FileIO\build-CreateSquareTable-Desktop_Qt_5_

除此之外,程序还在当前工作目录创建了一个名为SquareTable.txt的新文件,在资源管理器/文件管理器中找到这个文件并用记事本打开,可见其内容如下(前10行),这是一个平方值表。

N N^2--------------------1 12 43 94 165 256 367 498 64...

🚩第6 ~ 8行:使用getcwd()函数获取程序的当前工作路径(CurrentWorkingDirectory)并打印至屏幕。该函数由第3行的unistd.h头文件引入,其原型如下:

char* getcwd(char* buf, int size);

参数buf应指向预分配好的缓冲区(字符数组),size则为该缓冲区的大小。在正常情况下,函数会将当前工作路径拷贝至buf缓冲区,并返回buf作为结果。如果执行出错,则返回NULL。

🚩第10 ~ 14行:使用fopen()函数以“文本写”模式打开文件。fopen()函数由头文件stdio.h引入,其原型为:

FILE* fopen(const char* filename, const char* mode);

其中,filename是要打开的文件名。此处的SquareTable.txt未给出从根目录开始的绝对路径,其为相对路径。fopen()函数将在当前工作目录中打开该文件。由于该文件在程序执行之前事实上不存在且打开模式被设定为“文本写”,fopen()将新建该文件。

mode为文件打开模式,它设定了文件打开的目的和操作方式,详情见表20-2。当文件打开模式未说明是文本(text)还是二进制(binary)时,C语言默认以文本形式操作文件。故w等价于wt,r等价于rt。

表20-2 C语言的常用文件打开模式

如果fopen()函数打开文件失败,会返回空指针。上述代码的第11行将fopen()函数的返回值赋值给变量fp,然后再将赋值操作符的返回值与NULL做比较,若返回值为空,则报错并返回-1。回顾一下,表达式a=b除了把b赋值给a之外,还会返回b值做为表达式的结果。

如果fopen()函数成功打开文件,则会返回一个指向FILE结构的指针,该指针将作为后续文件读写操作的凭据。

🚩第16 ~ 20行:通过fprintf()及fputs()函数向文件中写入由字符串文本所构成的表格。下方同时列出了fprintf()与printf()的函数原型:

int fprintf(FILE * _File, const char * _Format, ...);int printf(const char * _Format, ...);

容易看出,fprintf()的使用方法及功能与printf()十分相似。fprintf()的第1个参数为指向FILE结构的指针,用于表明被写入的文件。在上述代码的第19行,占位符%14d代表一个输出宽度为14个字符的整数,当实际值少于14个字符时,左边补空格。fprintf()的返回值代表实际写入文件的字符数,如果写入失败,则会返回-1。

表20-3总结了C语言中常用的文本文件读写函数。

表20-3 文本文件读写函数(C语言)

🚩第22 ~ 25行:当文件读/写操作完成后,应尽快关闭文件。函数fclose()如果成功关闭文件,将返回0,否则返回-1。如果函数返回值不等于0,则表示文件关闭出错,打印相关错误信息并返回。

下述代码的实际效果与前述代码完全等同:当fclose(fp)关闭文件失败返回-1时,按非零即真原则,该逻辑判断为真,意为文件关闭失败。

22 if (fclose(fp)){//按非零即真原则判断文件是否关闭失败23 printf("File close error - SquareTable.txt.\n");24 return -1;25 }

但从软件工程的代码可读性角度来看,后者的代码容易被理解成:如果文件成功关闭,打印错误信息并返回。而前者的代码具备良好的自解释性:返回值如果不等于0,代表关闭失败。掌握了语言的语法规则只是程序设计道路上万里长征的第一步,程序设计的真实能力需要在长期的实践中摸索和总结。

在上述代码中,fp所指向的FILE结构由fopen()函数创建,fp只是指向该结构对象的指针。合理推测,fclose()函数将会释放fp所指向的FILE结构对象。

下述程序使用表20-3中的fgets()、fscanf()函数将SquareTable.txt中的内容读取并打印出来。

//Project - ReadSquareTable#include <stdio.h>int main(){FILE *fp = NULL;char sFile[] = "D:/C2Cpp/C20_FileIO/...Debug/SquareTable.txt";if ((fp=fopen(sFile,"rt"))==NULL){printf("File open error - SquareTable.txt.\n");return -1;//返回非零值表示程序出错}char sBuffer[512];if (fgets(sBuffer,512,fp))printf("%s",sBuffer);if (fgets(sBuffer,512,fp))printf("%s",sBuffer);int n=0, n2=0;while (1){if (fscanf(fp,"%d %d",&n,&n2)>0)printf("%6d%14d\n",n,n2);elsebreak;}if (fclose(fp)!=0){printf("File close error - SquareTable.txt.\n");return -1;}return 0;}

上述程序的执行结果为(前6行):

N N^2--------------------1 12 43 94 16...

🚩第6行:文件的绝对路径,其中的…意为该路径不完整,有省略。由于文件SquareTable.txt由其他程序创建,其很可能不位于程序ReadSquareTable的当前工作路径中,因此需要提供绝对路径或者恰当的相对路径。请读者按照实际情况进行修改。请注意,较新版本的Windows也允许使用/作为路径分隔符,考虑到\在C/C++中被用作转义符,为避免频繁录入\的麻烦,这里我们使用了/作为路径分隔符。

🚩第7行:以文本只读方式打开文件。如表20-2所示,文件打开模式中的r代表读(read),t代表文本(text)。

🚩第12~14行:通过fgets()函数从文件读取一个字符串并打印出来。这个字符串预期以换行符或者文件结尾(EOF, end of file)作为结束标志。函数会在读取终止后自动在缓冲区末尾添加表示字符串结束的0值。如果函数在遇到EOF未读到字符,将返回NULL表示读取失败。

🚩第18~24行:通过fscanf()函数从文件读取整数值并打印出来。第20行可见,fscanf()在使用方式上与scanf()非常相似。在正常情况下,函数将返回读取成功的项数。本例中,该值预期为2应大于0。如果遇到文件尾导致读取失败,函数将返回EOF(-1),进而导致break的执行并结束“死”循环。EOF为一个宏,其定义如下:

#define EOF (-1)

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++

Python编程基础及应用

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。