哪些属于网站评论,wordpress分页目录,如何做好推广,个人主页简介大家好#xff0c;这里是小编的博客频道 小编的博客#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识#xff0c;希望能在这里与大家共同进步#xff0c;共同收获更好的自己#xff01;#xff01;#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分… 大家好这里是小编的博客频道 小编的博客就爱学编程 很高兴在CSDN这个大家庭与大家相识希望能在这里与大家共同进步共同收获更好的自己 本文目录 引言正文一、为什么要用文件二、文件的分类三、文件指针四、文件的打开与关闭1. 文件的打开2. 文件的关闭 五、文件缓冲区六、文件的基本操作1打开文件2关闭文件3检测文件末尾和错误4清除文件错误标志 七、顺序读写文件1字符级操作函数fgetc()fputc() 2字符串级操作函数fgets()fputs() 3格式化输入输出函数fprintf()fscanf() 八、随机读写文件1文件指针与定位函数示例代码示例1基本随机读写示例2使用ftell获取当前位置示例3二进制文件的随机读写 九、读取错误检查1错误检查函数2错误处理策略3示例代码示例1使用ferror检查读取错误示例2使用feof检查文件末尾 十、总结 快乐的时光总是短暂咱们下篇博文再见啦不要忘了给小编点点赞和收藏支持一下在此非常感谢 引言
在C语言编程中文件操作是数据处理的重要部分。通过文件我们可以实现数据的持久化存储和共享。下面重点通过多个例子讲清文件的打开和关闭这两个函数。那现在宝子们就跟着小编的步伐一起进入本章知识的学习。Go!Go!Go! 那接下来就让我们开始遨游在知识的海洋 正文 一、为什么要用文件
这是因为 在程序执行过程中有时需要将数据保存下来供以后使用或者从外部获取数据进行处理。这时我们就需要使用到文件。文件是一种用于存储数据的媒介它可以是磁盘上的物理文件也可以是内存中的虚拟文件。通过使用文件我们可以方便地实现数据的长期保存和跨程序的数据共享。 二、文件的分类
在C语言中文件通常按照其内容和用途进行分类主要包括文本文件和二进制文件两种类型 文本文件以ASCII码或Unicode码形式存储的文件主要用于存储人类可读的字符信息如源代码、文档等。 二进制文件以二进制形式存储的文件主要用于存储机器可直接读取和处理的数据如图像、音频、视频等多媒体文件。 三、文件指针 在C语言中文件操作是通过文件指针来实现的。 文件指针是一个指向FILE结构体的指针该结构体包含了文件的各种信息如文件名、文件位置指示器、文件结束标志等。通过文件指针我们可以对文件进行各种操作如读写、定位等。 四、文件的打开与关闭
1. 文件的打开
在C语言中打开文件需要使用fopen()函数。该函数原型如下
FILE *fopen(const char *filename, const char *mode);其中filename参数是要打开的文件名包括路径mode参数指定了文件的打开模式。常见的打开模式有 r只读模式。如果文件不存在则打开失败如果文件存在则只能从中读取数据。w写模式。如果文件不存在则以指定的文件名创建新文件如果文件已存在则删除原有内容从头开始写入新数据。a追加模式。如果文件不存在则以指定的文件名创建新文件如果文件已存在则在文件末尾追加新数据。rb、wb、ab分别表示以二进制方式打开文件进行读、写、追加操作。 以下是一些使用fopen()函数打开文件的示例
示例1以只读模式打开文本文件
#include stdio.hint main() {FILE *fp;fp fopen(text.txt, r); // 打开名为text.txt的文本文件以只读模式if (fp NULL) {printf(无法打开文件
);return 1;} else {printf(文件成功打开
);// 在此处可以进行文件读取等操作fclose(fp); // 关闭文件}return 0;
}示例2以写模式打开文件
#include stdio.hint main() {FILE *fp;fp fopen(output.txt, w); // 打开名为output.txt的文件以写模式if (fp NULL) {printf(无法打开文件
);return 1;} else {fprintf(fp, Hello, World!
); // 向文件中写入字符串fclose(fp); // 关闭文件}return 0;
}示例3以追加模式打开文件
#include stdio.hint main() {FILE *fp;fp fopen(append.txt, a); // 打开名为append.txt的文件以追加模式if (fp NULL) {printf(无法打开文件
);return 1;} else {fprintf(fp, This is a new line.
); // 向文件末尾追加字符串fclose(fp); // 关闭文件}return 0;
}示例4以二进制方式打开文件
#include stdio.hint main() {FILE *fp;fp fopen(binaryfile.bin, rb); // 打开名为binaryfile.bin的文件以二进制方式读取if (fp NULL) {printf(无法打开文件
);return 1;} else {// 在此处可以进行二进制文件的读取等操作fclose(fp); // 关闭文件}return 0;
}2. 文件的关闭
在完成文件操作后我们需要使用fclose()函数来关闭文件。该函数原型如下
int fclose(FILE *stream);其中stream参数是一个指向要关闭的文件的指针。fclose()函数会关闭文件并释放与该文件相关的资源。如果关闭文件时发生错误则返回非零值通常为EOF否则返回0。
以下是一个使用fclose()函数关闭文件的示例
示例5关闭文件
#include stdio.hint main() {FILE *fp;fp fopen(example.txt, r); // 打开一个文件if (fp ! NULL) {// 在此处可以进行文件读取等操作if (fclose(fp) ! 0) { // 关闭文件并检查是否成功perror(Error closing file); // 如果关闭失败打印错误信息}} else {printf(无法打开文件
);}return 0;
}需要注意的是
在使用完文件后一定要及时关闭它以避免资源泄露和潜在的文件损坏问题。同时如果在打开文件时使用了fopen()函数并且成功打开了文件那么在关闭文件时一定要确保传递给fclose()函数的指针是与fopen()返回的指针相同的。 五、文件缓冲区 为了提高文件操作的效率C语言引入了文件缓冲区的概念。当向文件写入数据时数据首先被写入到缓冲区中而不是直接写入到磁盘上。只有当缓冲区满或者显式地调用刷新函数如fflush()时缓冲区中的数据才会被写入到磁盘上。同样地当从文件读取数据时也是先从磁盘上将数据读取到缓冲区中然后再从缓冲区中读取数据给程序使用。 这种缓冲区机制可以减少磁盘I/O操作的次数从而提高文件操作的效率。但是在某些情况下如需要立即将数据写入磁盘以确保数据安全时我们可能需要手动刷新缓冲区或者使用无缓冲的文件操作方式。 综上所述
C语言的文件操作涉及多个方面包括文件的打开与关闭、读写操作、文件指针的使用以及文件缓冲区的处理等。通过掌握这些基础知识我们可以更加高效地进行文件操作和数据处理工作。 六、文件的基本操作
1打开文件
使用fopen函数可以打开一个文件。函数的原型如下 FILE *fopen(const char *filename, const char *mode); 其中filename是文件名包含路径mode是文件的打开模式如读、写等。
常见的模式有 r : 只读方式打开文件该文件必须存在。 w : 写入方式打开文件若文件存在则长度被截为0即该文件内容会消失若文件不存在则创建新文件。 a : 以附加的方式打开文件写入的数据会被添加到文件尾即使使用了 fseek 之类的函数也不会改变。 r : 可读写的方式打开文件该文件必须存在。 w : 可读写方式打开文件若文件存在则文件长度被截为0即该文件内容会消失若文件不存在则创建新文件。 a : 以可读写的方式打开文件写入的数据会被添加到文件尾。 2关闭文件
使用 fclose 函数可以关闭一个已打开的文件。函数的原型如下 int fclose(FILE *stream); 3检测文件末尾和错误 feof(FILE *stream): 检测是否到达文件末尾。
ferror(FILE *stream): 检测是否发生读写错误。
4清除文件错误标志
使用 clearerr 函数可以清除文件错误标志和文件结束标志。函数的原型如下 void clearerr(FILE *stream); 顺序读写是指按照文件中数据的存储顺序依次进行读写操作。 七、顺序读写文件 在C语言中文件的顺序读写涉及多个函数这些函数允许我们按照文件中的存储顺序来读取或写入数据。以下是顺序读写相关的函数详细介绍及代码示例 1字符级操作函数
fgetc()
功能
从指定的文件流中读取下一个字符一个无符号字符并将其作为int类型的值返回。如果到达文件末尾EOF或发生错误则返回EOF。 原型 int fgetc(FILE *stream); 示例
#include stdio.h
int main() {FILE *pf fopen(text.txt, r); // 打开已经创建好的文件if (pf NULL) {perror(fopen);return 1;}// 读文件int ret fgetc(pf);printf(%c, ret);
ret fgetc(pf);
printf(%c
, ret);
ret fgetc(pf);
printf(%c
, ret);
// 关闭文件
fclose(pf);
pf NULL;
return 0;
}fputc()
功能
将一个字符写入到指定的文件流中。 原型int fputc(int character, FILE *stream); 示例
#include stdio.h
int main() {FILE *pf fopen(text.txt, w); // 以写模式打开文件if (pf NULL) {perror(fopen);return 1;}// 写文件fputc(a, pf);fputc(b, pf);fputc(c, pf);// 关闭文件fclose(pf);pf NULL;return 0;
}
2字符串级操作函数
fgets()
功能
从指定的文件流中读取一行文本包括换行符如果有的话但最多读取到数组大小减一的位置并将其存储在字符串中。如果成功它会返回一个指向该字符串的指针如果发生错误或到达文件末尾EOF而没有读取任何字符则返回NULL。 原型 char *fgets(char *string, int n, FILE *stream); 示例
#include stdio.h
int main() {char arr[10] {0};FILE *pf fopen(text.txt, r); // 以读模式打开文件if (pf NULL) {perror(fopen);return 1;}// 读文件fgets(arr, sizeof(arr), pf);printf(%s, arr);
// 关闭文件
fclose(pf);
pf NULL;
return 0;
}fputs()
功能
将字符串写入到指定的文件流中但不包括空字符’\0’。如果成功它返回非负值如果发生错误则返回EOF。 原型 int fputs(const char *string, FILE *stream); 示例
#include stdio.h
int main() {FILE *pf fopen(text.txt, w); // 以写模式打开文件if (pf NULL) {perror(fopen);return 1;}// 写文件fputs(Hello, World!, pf);
// 关闭文件
fclose(pf);
pf NULL;
return 0;
}3格式化输入输出函数
fprintf()
功能
向指定的输出流如文件写入格式化的数据。 原型 int fprintf(FILE *stream, const char *format[, argument]...); 示例
#include stdio.h
struct S {char arr[10];int num;float sc;
};
int main() {struct S s {abcde, 10, 5.5f};FILE *pf fopen(text.txt, w); // 以写模式打开文件if (pf NULL) {perror(fopen);return 1;}// 写文件fprintf(pf, %s %d %f, s.arr, s.num, s.sc);// 关闭文件fclose(pf);pf NULL;return 0;
}fscanf()
功能
从指定的输入流如文件中按照指定格式读取数据。 原型 int fscanf(FILE *stream, const char *format[, argument]...); 示例
#include stdio.h
struct S {char arr[10];int num;float sc;
};
int main() {struct S s {0};FILE *pf fopen(text.txt, r); // 以读模式打开文件if (pf NULL) {perror(fopen);return 1;}// 读文件fscanf(pf, %s %d %f, s.arr, (s.num), (s.sc));// 打印printf(%s %d %f, s.arr, s.num, s.sc);
// 关闭文件
fclose(pf);
pf NULL;
return 0;
}在C语言中文件的随机读写是指能够在文件的任意位置进行读取或写入数据而不仅仅是顺序地从头到尾处理文件。这种能力在处理大型数据文件时尤为重要因为它允许程序高效地访问和修改文件中的特定部分。 八、随机读写文件
1文件指针与定位函数
要实现文件的随机读写首先需要了解几个关键概念 文件指针用于标识打开的文件及其在存储设备上的当前位置。 定位函数如fseek()、ftell()和rewind()等用于移动文件指针到指定位置或获取当前位置。 fseek(FILE *stream, long offset, int whence)将文件指针移动到相对于某个位置的偏移量处。 whence可以是SEEK_SET文件开头、SEEK_CUR当前位置或SEEK_END文件末尾。 ftell(FILE *stream)返回当前文件指针的位置相对于文件开头的字节数。rewind(FILE *stream)将文件指针重新定位到文件的开头。 示例代码
以下是一些具体的例子展示了如何在C语言中进行文件的随机读写操作。
示例1基本随机读写
#include stdio.h
#include stdlib.hint main() {FILE *file fopen(example.txt, w);if (!file) {perror(Failed to open file);return EXIT_FAILURE;}// 写入一些初始数据fprintf(file, Hello, World!
This is a test.
);// 移动到文件的第7个字节处索引从0开始fseek(file, 6, SEEK_SET);// 在此处写入新字符fputc(C, file);// 重置文件指针到文件开头rewind(file);// 读取并打印文件内容char buffer[100];while (fgets(buffer, sizeof(buffer), file)) {printf(%s, buffer);}fclose(file);return EXIT_SUCCESS;
}在这个例子中我们打开了一个名为example.txt的文件写入了初始数据然后将文件指针移动到第7个字节处即H和e之间并将该位置的字符替换为C。最后重置文件指针并打印整个文件的内容。
示例2使用ftell获取当前位置
#include stdio.h
#include stdlib.hint main() {FILE *file fopen(numbers.txt, w);if (!file) {perror(Failed to open file);return EXIT_FAILURE;}// 写入一系列数字for (int i 0; i 10; i) {fprintf(file, %d
, i);}// 移动到文件的第5行实际上是第4个换行符之后fseek(file, 4 * (sizeof(int) 1), SEEK_SET); // 假设每个数字和换行符占用固定大小的空间// 获取当前文件指针位置long position ftell(file);printf(Current file pointer position: %ld
, position);// 从当前位置继续写入fprintf(file, Inserted Number
);// 重置文件指针并打印文件内容rewind(file);char buffer[100];while (fgets(buffer, sizeof(buffer), file)) {printf(%s, buffer);}fclose(file);return EXIT_SUCCESS;
}这个例子中我们创建了一个包含数字的文件然后尝试在第5行的位置插入一个新字符串。注意这里对文件指针的移动是基于假设的固定大小的数字和换行符实际应用中可能需要更精确的计算或使用其他方法来确定正确的偏移量。
示例3二进制文件的随机读写
#include stdio.h
#include stdlib.htypedef struct {int id;float value;
} Record;int main() {FILE *file fopen(records.bin, wb);if (!file) {perror(Failed to open file);return EXIT_FAILURE;}// 写入一些记录Record records[] {{1, 1.1}, {2, 2.2}, {3, 3.3}};fwrite(records, sizeof(Record), 3, file);// 移动到第二条记录的位置索引从0开始fseek(file, sizeof(Record), SEEK_SET);// 读取并修改第二条记录Record temp;fread(temp, sizeof(Record), 1, file);temp.value 10.0;// 将修改后的记录写回原位置覆盖旧记录fseek(file, -sizeof(Record), SEEK_CUR); // 或者直接使用之前的ftell结果fwrite(temp, sizeof(Record), 1, file);// 重置文件指针并验证内容这里仅为了演示实际应关闭文件后重新打开读取rewind(file);Record readRecords[3];fread(readRecords, sizeof(Record), 3, file);for (int i 0; i 3; i) {printf(ID: %d, Value: %.2f
, readRecords[i].id, readRecords[i].value);}fclose(file);return EXIT_SUCCESS;
}在这个例子中我们处理一个二进制文件其中存储了结构体数组。我们展示了如何移动到特定的记录位置读取它进行修改然后再将其写回到文件中。注意由于我们在同一文件流中进行了读取和写入操作而没有关闭再重新打开文件这里的验证步骤在实际应用中可能不准确通常你应该在修改完文件后关闭它并在需要时以只读模式重新打开它以验证更改。 在C语言中对文件进行读写操作时进行错误检查是至关重要的。这不仅可以确保数据的完整性还能提高程序的健壮性和可靠性。本文将详细介绍C语言文件操作中如何进行读取错误检查并通过多个例子加以说明。 九、读取错误检查
1错误检查函数
C语言提供了几个函数来检查文件操作的错误状态 ferror用于检查文件流上的最后一个I/O操作是否出错。其原型为int ferror(FILE *stream);。如果返回非零值则表示发生了错误。 perror用于打印描述最近一次错误的字符串。其原型为void perror(const char *s);。其中s是一个用户提供的错误信息前缀通常用于指示发生错误的上下文。 feof用于检查是否已经到达文件末尾。其原型为int feof(FILE *stream);。如果返回非零值则表示已经到达文件末尾。 2错误处理策略
在进行文件操作时应该遵循以下错误处理策略 在每次调用文件操作函数后立即检查其返回值或错误状态。 如果发现错误根据具体情况采取适当的措施如打印错误信息、清理资源并退出程序等。 使用clearerr函数清除文件流的错误标志和文件结束标志以便进行下一轮的文件操作。 3示例代码
以下是几个使用上述函数进行文件读取错误检查的示例代码
示例1使用ferror检查读取错误
#include stdio.hint main() {FILE *fp fopen(sample.txt, r);if (fp NULL) {perror(Failed to open file);return 1;}char buffer[100];size_t bytesRead fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);if (ferror(fp)) {perror(Error reading file);fclose(fp);return 1;}// 确保缓冲区以null字符结尾buffer[bytesRead] \0;printf(Read from file: %s
, buffer);fclose(fp);return 0;
}在这个例子中我们尝试从一个名为sample.txt的文件中读取数据。如果在读取过程中发生错误我们使用ferror函数进行检查并使用perror函数打印错误信息。
示例2使用feof检查文件末尾
#include stdio.hint main() {FILE *fp fopen(numbers.txt, r);if (fp NULL) {perror(Failed to open file);return 1;}int number;while (!feof(fp)) {if (fscanf(fp, %d, number) ! 1) {// 检查是否是因为到达文件末尾而失败if (!feof(fp) ferror(fp)) {perror(Error reading number from file);fclose(fp);return 1;}// 如果是文件末尾则跳出循环break;}printf(Read number: %d
, number);}fclose(fp);return 0;
}在这个例子中我们尝试从一个名为numbers.txt的文件中读取整数。我们使用feof函数来检查是否已经到达文件末尾同时使用ferror函数来检查是否发生了其他读取错误。 十、总结 顺序读写按照文件中数据的存储顺序依次进行读写操作常用函数有 fprintf , fscanf , fgets , fputs等。 随机读写可以在文件中的任意位置进行读写操作常用函数有fseek , ftell , rewind等。 错误检查在进行文件操作时应始终检查返回值并使用 feof 和 ferror 来检测是否到达文件末尾或发生错误。 快乐的时光总是短暂咱们下篇博文再见啦不要忘了给小编点点赞和收藏支持一下在此非常感谢