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';   	//报错
posted on 2023-11-26 20:39  持枢丶  阅读(163)  评论(0编辑  收藏  举报