C语言【文件操作】
C语言【文件操作】
1、输入/输出流的定义。
C语言中,文件输入/输出以流的方式进行。
读还是写,输入还是输出,是站在内存(程序)的角度来看的。从程序(内存)向 数据源(如文件、网络等)传递数据的过程叫做读数据,读数据使用的路径叫做输入流,一般读数据的过程是一个解码的过程;从数据源(如文件、网络等)向 内存(程序)传递数据的过程叫做写数据,写数据使用的路径叫做输出流,一般写数据的过程是一个编码的过程。
编码和解码使用的字符集不一致时会出现乱码。
2、标准输入输出(一般指从键盘输入,从控制台输出)
scanf(...) 和 printf(...) 略
// getchar 用于从标准输入流(通常是键盘)读取一个字符。以下是其函数定义:
int getchar(void); // 返回一个数值(读取的字符的ASCII码),用变量接收处理
// putchar 用于将一个字符写入到标准输出流(通常是控制台)。以下是其函数定义:
int putchar(int character); // 返回一个整数值(写入字符的ASCII码)。参数为写入字符。
// gets 用于从标准输入流读取一个字符串。
char *gets(char *str); // 返回值和参数都是读取到的那个字符串。
// puts 用于将参数输出到控制台。
int puts(const char *str); // 返回成功输出的字符个数。参数为要输出的字符串。
// 有些函数主要作用是操作文件的(比如从文件中读数据),改变一下参数,也可成为标准输入输出(比如从控制台中拿数据),比如下面这个函数:
fgets(指针, 长度, stdin); // 第一个参数存数据,长度,stdin指定为操作对象为控制台。
3、文件读写
以下的文件操作函数都在<stdio.h>中
**关于操作模式,总说一下: **
**r重点是读,以r开头的操作不存在文件时会打开失败,从开头开始操作,所以r+会不清空覆盖 **
**w重点是写,以w开头的操作不存在文件时会创建出来,写数据前清空,因为它不是追加 **
**a就是追加,a+就很搞笑,从末尾开始的话,没法读取到数据 **
/**
* 打开文件
* 返回一个操作文件的指针。
* 第一个参数为要操作的文件路径及文件名。
* 相对路径和绝对路径知识略。win路径分隔符为/或\\(转义),Unix为/,当前目录下可以加./也可不加。
* 第二个参数为模式。如"r" ----- 这个模式是个字符串。
* r只读。w清空原文件并写入。a追加。b二进制。+为省略r和w。(b和+不能单独使用)
* 组合有:rb、wb、ab、r+、w+、a+、rb+、r+b、wb+、w+b、ab+、a+b
* r/r+不创建新文件,文件不存在时不能正确读取; 写文件时,如果目录不存在则报错
* 使用w时,未关闭流继续写则为追加。
*/
FILE *fopen(const char *filename, const char *mode);
/*
写文件
*/
// 第一种。一次写一个字符。
int fputc(int character, FILE *stream); // 成功返回写入字符的ASCII码;失败返回EOF,即-1
// 第二种。写入字符串。第一个参数为要写入的字符串;第二个参数为文件指针。
int fputs(const char *str, FILE *stream); // 成功返回写入的字符个数;失败返回EOF,即-1
// 第三种。第一个参数为文件指针;第二个参数为带占位符的字符串;...为可变参。
int fprintf(FILE *stream, const char *format, ...); //成功返回写入字符个数;失败返回EOF,即-1
/*
读文件
*/
// 第一种。读一个字符。
int fgetc(FILE *stream); // 返回读取字符的ASCII码。失败返回EOF,即-1
// 第二种。读一个字符串。之前介绍过它的读取控制台的数据。第二个参数为个数;第三个参数为文件指针或指定控制台读
char *fgets(char *str, int num, FILE *stream); // 返回值和第一个参数都是读取到的字符串。失败返回NULL。
// 第三种。
int fscanf(FILE *stream, const char *format, ...);
fscanf(file, "%s %s %d", msg1, msg2, &num); // 读取到后面的变量中。占位符之间的空格表示文件中的空格或换行。
补
union {
int a;
int b;
} *p, u;
p = &u; // 对于自定义数据类型来说,下面要使用指针时,必须这样指向一下。
const int *p; // p可改变指向,*p不可改变
int const *p; // p可改变指向,*p不可改变
int * const p; // p不可改变指向,*p可改变
cosnt int * const p; // p不可改变指向,*p也不可改变
// 简单来说,p前的const把p给锁定了,*前的const把*p给锁定了,都有则都锁定。
// int 和 const 紧挨着时,他俩可以交换位置。
在vscode中,让编译出的可执行文件在控制台输出且编码方式改为GBK编码的方式为:task.json文件中的args属性中添加:"-fexec-charset=gbk";在lauch.json文件中修改"configurations"属性第一个数组的“externalconsole”属性改为true。
getchar()会吃掉'\n',他就相当于scanf("%c", 变量); 所以有时需要使用两个getchar()才可以使控制台输入完后停留。
scanf("%d\n", 变量); 它不吃回车或换行是因为它不是%c。如果它在getchar()前,它前面如果还有输入,输入中如果按了回车它也不吃,它后面的getchar()也吃不掉,回车就被消耗掉了。
#include<stdlib.h>
int main(){
system("这里面可以填写cmd的命令");
return 0;
}
case中的break是跳出switch;if中的break是跳出这层循环。
注意下面代码中的知识点
char *p = "hello"; // 这个hello是个字面量,不可更改
*(p+2) = 'a'; //报错