目录
fprintf(),fscanf(),fgets(),和fputs()
文件的基础知识
函数
main函数过长可以分为多个函数部分,同样的函数过程也可以分为多个文件。
这部分作为一个文件并未定义max函数
#include<stdio.h>
int main()
{
int a = 5;
int b = 6;
printf("%d", max(a, b));
return 0;
}
此时我们有两种选择:
1将max函数与main放于一个文件中
#include<stdio.h>
int max(int n, int m)
{
return n > m ? n : m;
}
int main()
{
int a = 5;
int b = 6;
printf("%d", max(a, b));
return 0;
}
2.将max函数与main函数放置于一个项目下的不同文件中
头文件
以上是对于函数的讨论,同时我们也可以把这部分函数定义为一个头文件。
添加一个文件,并将其后缀设置为.h
主函数部分
max函数部分
头文件部分
对于以上的注意事项
- 关于<>的使用,#include后的<>表示在官方标准库中寻找一个头文件,这样的<>是无法找到我们自己编写的头文件的
- ""的使用,表示为先在用户的文件中寻找是否有这样一个头文件,如若找不到一个这样的文件则在官方的标准库中寻找
- 各个部分队友函数max(n,m)中每个部分都需要是相同的,不论是返回类型还是,n,m的数据类型。这样可以避免出错。
c语言中的文件
在C语言中,文件是数据的持久存储和检索的一种方式。文件可以存储在计算机的磁盘上或其他永久性存储设备上。C语言提供了一组标准库函数,使得程序能够打开、读取、写入和关闭文件。
文件在C语言中可以分为文本文件和二进制文件:
-
文本文件: 文本文件是以文本形式存储的文件,其中的数据是以字符的形式存储的,可以使用文本编辑器打开查看。文本文件中的数据通常是人可读的,例如,文本文件可以包含文本文档、配置文件等。在C语言中,可以使用标准库函数进行文本文件的读写操作,例如
fscanf
、fprintf
等。 -
二进制文件: 二进制文件是以二进制形式存储的文件,其中的数据不一定是人可读的。二进制文件可以包含任意类型的数据,例如图像文件、音频文件、数据库文件等。在C语言中,可以使用标准库函数进行二进制文件的读写操作,例如
fread
、fwrite
等。
文件通常用于在程序的不同运行之间保持数据的持久性,以及与外部系统进行数据交换。文件操作是C语言中一个重要的主题,通过文件操作,程序能够进行数据的长期存储和检索。
打开和关闭文件
文件类型指针
在C语言中,文件类型指针是用来指向文件的指针变量。主要用于打开文件、读写文件和关闭文件等文件操作。文件类型指针的类型是 FILE
,这个类型是通过 <stdio.h>
头文件定义的。
常用的文件类型指针包括:
FILE *
: 用于指向文件的指针类型。你可以声明一个FILE
类型的指针来引用一个文件。
下面是一个简单的例子,演示了如何声明和使用文件类型指针:
#include <stdio.h>
int main() {
FILE *filePointer;
// 打开文件
filePointer = fopen("example.txt", "r");
// 检查文件是否成功打开
if (filePointer == NULL) {
printf("文件打开失败。\n");
return 1;
}
// 进行文件操作,例如读取或写入
// 关闭文件
fclose(filePointer);
return 0;
}
在上述例子中,filePointer
是一个指向文件的指针,通过 fopen
函数打开文件后,将文件的地址赋给了 filePointer
。然后可以使用这个指针进行文件操作,最后使用 fclose
函数关闭文件。
注意:在使用文件指针进行文件操作之前,最好检查文件是否成功打开,以避免在没有成功打开文件的情况下进行操作。
标准文件和相关联的文件指针
标准文件 | 文件指针 | 通常使用的设备 |
标准输入 | stdin | 键盘 |
标准输出 | stdout | 显示器 |
标准错误 | stderr | 显示器 |
打开文件
#include <stdio.h>
int main() {
FILE *filePointer;
// 使用fopen函数打开文件,返回一个指向文件的指针
filePointer = fopen("example.txt", "r"); // 第一个参数是文件名,第二个参数是打开文件的模式
// 检查文件是否成功打开
if (filePointer == NULL) {
printf("文件打开失败。\n");
return 1; // 表示出现错误
}
// 执行文件操作,如读取或写入
// 关闭文件
fclose(filePointer);
return 0; // 表示程序成功执行
}
在上述示例中,fopen
函数用于打开文件,它的第一个参数是文件名,第二个参数是打开文件的模式。常见的模式有:
- "r":只读
- "w":写入(如果文件存在则截断,不存在则创建)
- "a":追加(如果文件存在则在末尾添加,不存在则创建)
- "r+":读写
- "w+":读写(如果文件存在则截断,不存在则创建)
- "a+":读写追加(如果文件存在则在末尾添加,不存在则创建)
关闭文件
针对上面给出的例子,使用 fclose
函数来关闭打开的文件。在文件操作完成后,最好及时关闭文件以释放资源。
fclose(filePointer);
getc()和putc()函数
ch=getchar();意为从标准库中获取一个字符
ch=getc(fp);意为从fp所指定的文件中获取一个字符
putc(ch,fpout);意为把字符ch放入FILE指针fpout指定的文件中
putc(cj,stdout)与putchar(ch)的作用相同
fclose函数
fclose(fp)函数关闭fp所指定的文件,必要时刷新缓冲区。对于正式的程序,应该检查是否成功关闭文件。如果关闭成功,fclose函数返回0,否则返回EOF。
fprintf(),fscanf(),fgets(),和fputs()
fprintf(),fscanf()这两个函数的使用与printf和scanf函数类似,不同的是前者需要用第一个参数指定待处理文件。
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
int main (void)
{
FILE *fp;
char words[MAX];
if ((fp = fopen ("wordy", "a+")) == NULL)
{
fprintf (stdout, "Can't open \"wordy\" file.\n");
exit(EXIT_FALLURE);
}
puts ("Enter words to add to the file; press the #");
puts("key at the begining of a line to terminate.");
while (fscanf(stdin,"%40s",words)==1) && words[0] != '\0')
fprintf (fp, "%s\n", words);
puts ("file conterts :");
rewind(fp); /* 返回到文件开始处*/
while (fscanf (fp, "%s", words) == 1)
puts (words);
puts("done\n");
if (fclose(fp) != 0)
fprintf (stderr, "Error closing file\n");
return 0;
}
fprintf (stdout, "Can't open \"wordy\" file.\n");
fscanf(stdin,"%40s",words)==1
fgets(buf,STLEN,fp);
这里buf是char类型数组的名称,STLEN是字符串的大小,fp为指向FILE的指针。
fgets()函数读取到它所遇到的第一个换行字符的后面,或者读取STLEN-1个字符,或者读取到文件结尾. 然后 fgets() 函数向末尾添加一个空字符(’/0‘)以构成个字符串.所以,字符串的最大长度是字符的最大数目再加上一个空字符.如果 fgets()函数在达到上限数目之前读完了一整行,它将在字符串的空字符之前添加一个换行符以标识一行结束. 这是 fgets 函数 和 gets() 函数的不同之处,后者读取换行符后将其丢弃。fgets()函数遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果位于岛EOF则返回之前给它传的第一个地址。
fputs(buf,fp);
这里 buf 是字符串地址,fp 指定目标文件
fputs()函数接受两个参数,它们依次是一个字符串的地址和一个文件指针.它把字符串地址指针所指的字符串写入指定文件.与 puts( 函数不同,fputs()函数打印的时候并不添加一个换行符.
由于 fgets()函数保留了换行符,而 fputs() 函数不会添加换行符,所以它们配合得相当好程序清单
随机访问:fseek()和ftell()
在 fseek()的 3 个参数中:第一个参数是一个指向被搜索文件的 FILE 指针.应该已经使用 fopen() 打开了该文件
fseek()的第二个参数称为偏移量(offset),表示从起始点开始要移动的距离(. 这个参数必须是一个 long 类型的值,可以为正(前移)负(后移),也可以为零(保持不动)。
模式 | 偏移量起始点 |
SEEK_SET | 文件开始处 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾 |
如果一切正常,fseek()的返回值为0;如果出现错误(如试图移动的距离超出文件的范围),其返回值为-1.
ftell() 函数为 long 类型,它返回文件的当前位置.在 ANSI 下,ftelll 函数在 stdio.h头文件中被声明,像最初在 UNIX 中实现的那样,ftelll) 函数通过返回距文件开始处的字节数目来确定文件的位置.文件的第一个字节到文件开始处的距离是字节 0,依此类推.在 ANSI C 下,这种定义适用于以二进制模式打开的文件,但是于对以文本模式打开的文件来讲,不一定是这样。