文件在程序中是以流的形式来操作的:(1)输入流:数据从数据源(文件)到程序(内存)的路径;(2)输出流:数据从程序(内存)到数据源(文件)的路径
一、屏幕输入输出
1. getchar() 和 putchar()
int getchar(void):从屏幕读取一个字符,并把它返回为一个整数,这个函数在同一个时间内只会读取一个单一的字符。在循环内使用这个方法,可以从屏幕上读取多个字符。
int putchar(int c):把一个字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。在循环内使用这个方法,可以在屏幕上输出多个字符。
#include<stdio.h> int main(){int c;printf("输入字符: "); c = getchar(); // 输入字符: 2printf("输入的字符是: ");putchar(c); // 输入的字符是: 2return 0;
}
2. gets() 和 puts()
char *gets(char *s):从屏幕读取一行到 s 所指向的缓冲区,直到该行结束。
int puts(const char *s):把字符串s和一个尾随的换行符输出到屏幕。
#include<stdio.h> int main(){char str[100];printf("输入字符串: "); gets(str); // 输入字符串: helloprintf("输入的字符串是: ");puts(str); // 输入的字符串是: helloreturn 0;
}
3. scanf() 和 printf()
int scanf(const char *format, ...) :从标准输入流 键盘上 读取输入,并根据提供的 format 来处理输入。
int printf(const char *format, ...) :把输出写入到标准输出流 屏幕上,并根据提供的format处理输出format :可以是一个简单的常量字符串,分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。
#include<stdio.h> int main(){char str[100];int i;printf("输入内容: "); scanf("%s %d", str, &i); // 输入内容: hello 2printf("str = %s, i = %d", str, i); // str = hello, i = 2return 0;
}
二、文件输入输出
1、文件打开和关闭
(1)fopen():创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE的一个对象,类型FILE包含了所有用来控制流的必要的信息。
FILE *fopen(const char *filename, const char *mode);
说明:filename是字符串,用来命名文件,访问模式 mode 的值可以是 "r"、"w"、"a"、"r+"、"w+"、"a+",如果处理的是二进制文件(图片视频)则需使用以下访问模式 "rb"、"wb"、"ab"、"rb+"、"wb+"、"ab+"
r | 打开一个已有的文件,允许读取文件。如果文件不存在,不会创建一个新文件。 |
w | 打开一个文件,允许写入文件。如果文件不存在,则会创建一个新文件。程序会从文件的开头写入内容,如果文件已经存在,则会将原内容覆盖。 |
a | 打开一个文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。程序会在已有的文件内容后面追加新的内容。 |
r+ | 打开一个已有的文件,允许读写文件。如果文件不存在,不会创建一个新文件。 |
w+ | 打开一个文件,允许读写文件。如果文件不存在,则会创建一个新文件。程序会从文件的开头写入内容,如果文件已经存在,则会将原内容覆盖。 |
a+ | 打开一个文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。程序在读文件时从文件开头开始读取,程序在写文件时会在已有的文件内容后面追加新的内容, |
(2)fclose(): 关闭文件,读写完文件之后一定要关闭
int fclose( FILE *fp );
说明:如果成功关闭文件,fclose()函数返回 0,如果关闭文件时发生错误,函数返回 EOF,这个函数实际上会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
2、文件读写
(1)写文件
int fputc(int c, FILE *fp);
说明:函数 fputc() 把参数 c 的字符值写入到 fp 所指的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
int fputs(const char *s, FILE *fp);
说明:函数 fputs()把字符串 s 写入到 fp 所指的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
int fprintf(FILE *fp, const char *format,...)
说明:函数 fprintf() 把字符串 s 写入到 fp 所指的输出流中。
#include<stdio.h> int main(){// 创建文件指针FILE *fp = NULL;// 打开文件fp = fopen("file.txt", "w+");// 将内容写入文件(两种方式都可以)fputs("hello ", fp); fprintf(fp, "world");// 关闭文件fclose(fp);fp = fopen("file.txt", "w+"); // w+会覆盖原内容fprintf(fp, "你好"); // 此时文件中只有:你好fclose(fp);return 0;
}
(2)读文件
int fgetc( FILE *fp );
说明:函数 fgetc() 从fp 所指向的文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。
char *fgets( char *buf, int n, FILE *fp );
说明:函数 fgets() 从 fp 所指的输入流中读取 n-1个字符。它会把读取的字符串复制到缓冲区 buf中,并在最后追加一个 null 字符来终止字符串。如果这个函数在读取最后一个字符之前就遇到一个换行符\n或文件的末尾 EOF则只会返回读取到的字符,包括换行符。
int fscanf(FILE *fp, const char *format,...)
说明:函数 fscanf() 从 fp 所指的文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取。
#include<stdio.h> int main(){// 创建文件指针FILE *fp = NULL;// 定义一个缓冲区char buff[1024];// 打开文件fp = fopen("file.txt", "r"); // 文件内容为: hello world1// hello world2 // 读取文件内容(方式一)fscanf(fp, "%s", buff);printf("%s \n", buff); // hello// 关闭文件fclose(fp);// 读取文件内容(方式二)fp = fopen("file.txt", "r");fgets(buff, 1024, fp);printf("%s", buff); // hello world1fclose(fp);// 读取整个文件的内容fp = fopen("file.txt", "r");while(fgets(buff, 1024, fp) != NULL){ // 通过while循环可以一行一行读取整个文件printf("%s", buff);}fclose(fp);return 0;
}