运行代码:(思路全在注释当中)。后面修复了,已经可以连续存储内容到文本里面,不会因为每次运行而清除文本里面的数据,已经可以实现每次输入内容都可以存入内容到文本中了。
#include <stdio.h>
//实现的路上遇到的问题
//1.循环打不出来字符不知道为啥,只能打出几个循环结束条件不是\0;而是NULL
//2.fopen 循环结束条件不是\0;而是EOF
//3.读取文件内容时候,输出的是乱码
//4.目前卡在咋实现那种,就是第一次存储内容进文档中去,然后第二次存进去,不让第一次存的内容消失
//这样的就可以存很多内容了。
//5.后面找到a+这个打开方式就可以追加了。解决上面第四个问题。
//一点点想法吧
//1.**写和读,要注意的是区分w+和r+;w+好处是如果不存在文件自动创建,
//但是不能自己在外面提前输入内容,因此w+要配合写入操作才读,=不然内容为空
//而r+好处是不会清空文本内容/。但是,不能自动创建;
//那么有哪个可以结合这两个毛病来更好的完美修补嘛。
//我好像看了一遍下去,这两个真不能完美补齐,只能说选一个来操作
//相对来说,自己提前创建一个文本比较好,这样就可以持续存储。
//2.
//对文件只读操作
void duwenjian() {
//1.fp为FILE 定义的一个文件指针,fopen函数的调用方式为:fopen(文件名,打开方式);
//这里路径分为绝对路径还有其他路径
//在这里还要去了解其他的打开方式,读取r
//
FILE *fp = fopen("C:\\Users\\11446\\Desktop\\阿祥玩回文5.txt", "r");
//2.if为判断一下是否存在文档,打开方式为r意思为读,如果不存在的话
if (fp == NULL) {
printf("打开失败,文档不存在");
return ;
}
//fgetc该函数是读取文档里面的一个字符
//2.fopen 循环结束条件不是\0;而是EOF。
printf("对文档进行读取操作\n");
while (!feof(fp)) { //!feof(fp)这个是判断是否读完的一个方法
char a = fgetc(fp);
printf(" %c ", a);
}
printf("\n\n");
//判断是否读完的方法如下
//while ((a=fgetc(fp)) != EOF)//停止条件为是否等于EOF
//while (1)//停止条件为是否等于EOF
//while (!feof(fp))//使用函数判断结尾
//{
// char a = fgetc(fp);//两个方法都可以实现打开文件
// /*if (a == EOF)
// {
// break;
// }*/
// printf("%c ", a);//不知道为啥打印会打印出一堆问号,也就是打印不了中文
//}
fclose(fp);//每次打开都需要关闭文件。
}
//给文档输入内容
void xieruwenjian() {
//写入用w,w允许写,文件不存在自动创建,若存在文件,则清除里面内容。
FILE *fp1 = fopen("C:\\Users\\11446\\Desktop\\阿祥玩回文2.txt", "w");
if (fp1 == NULL) {
printf("打开失败,文档不存在");
return ;
}
//循环写入
//这里用到fputc函数,写入一个字符
printf("只对文档进行输入操作\n");
for (int i = 0; i < 10; i++) {
char b = fputc(i + 'b', fp1); //在这里可以放入一个数组,然后这个数组或者结构体内容由你自己输入内容就可以实现数据的存储了
printf("%c", b);
}
printf("\n\n");
// //下面这是一次性输入一串字符的函数实现。
//
// char b[128] = { 0 };//用之前初始化,不然里面内容有些乱码
// while (!feof(fp))
// {
// char *ssss = fgets(b, sizeof(b), fp);
// printf(" %s\n", ssss);
// }
// //char *ssss = fgets(b, sizeof(b), fp);
// //这个函数是把fp内容存入数组中然后填容量多大,输入;
// //这个函数的话,自己在外面输入进txt文件再读的话,会清空,只有在这里才可以输入。
// //解决的话,把w+改为r+,把写入给撤掉。但fgets只能输出一行,所以我们要进行循环输出。
//
// //printf(" %s\n", ssss);
// //printf(" %s\n",b);
fclose(fp1);
}
void duxiecaozuo() {
//w+允许写和读,文件不存在自动创建,若存在文件,则清除里面内容
printf("写和读取\n");
FILE *fp2 = fopen("C:\\Users\\11446\\Desktop\\阿祥玩文件.txt", "w+"); //绝对路径要双杠记得
if (fp2 == NULL) {
printf("操作失败\n");
return ;
}
//先写入
printf("写入内容为:\n");
for (int i = 0; i < 10; i++) {
char c = fputc(i + 'a', fp2);
printf("%c", c);
}
printf("\n");
//在这里就需要重置那个文件指针,不然下面读出来的只有空的内容了
//因为上面写入的时候文件指针一直往后面指;现在要把他重新弄为0位置差不多是这样。
rewind(fp2);
//后读
printf("读取内容为:\n");
while (!feof(fp2)) { //!feof(fp)这个是判断是否读完的一个方法
char d = fgetc(fp2);
printf(" %c ", d);
}
printf("\n\n");
fclose(fp2);
}
//格式化操作
//要用到fscanf读取的意思 ;fprintf();输入内容
void geshihuacaozuo() {
printf("格式化的读和写\n");
FILE *fp3 = fopen("C:\\Users\\11446\\Desktop\\阿祥玩文件.txt", "r+");
if (fp3 == NULL) {
printf("操作失败\n");
return ;
}
//写入
//格式化输入
fprintf(fp3, "%s\t%d\t%s\t%f\n", "滕祥3", 221, "计算机", 63.);
fprintf(fp3, "%s\t%d\t%s\t%f\n", "滕祥33", 22, "计算机", 60.);
fprintf(fp3, "%s\t%d\t%s\t%f\n", "滕祥30", 21, "计机1", 3.);
rewind(fp3);
//读取
/*char ax[4][20] = { 0 };//记得初始化
//1.不管是什么类型的数据统统以字符串的形式读取。如果要具体到类型的话也可以实现的,改一下下面就好了
fscanf(fp3, "%s %s %s %s ", ax[0], ax[1], ax[2], ax[3]); //意思就是把fp的数据存入到数组里面去
for (int i = 0; i < 4; i++) {
//下面三个法子都可以输出来。
//printf("%s %s %s %s ", ax[0], ax[1], ax[2], ax[3]);
printf("%s ", ax[i]);
//puts(ax[i]);//将一个字符串(以‘\0’结束的字符序列)输出到终端
}
printf("\n");
*/
//2.具体的类型,已经输出多个信息,推荐这个
//这个可以改为顺序表和结构体的。
char name[20] = { 0 };
int age = 0;
char grade[20] = { 0 };
float score = 0;
while (!feof(fp3)) {
//在这里需要注意一个细节,下面这个fscanf后面要加个\n;不然会输出多一行出来才结束。
fscanf(fp3, "%s %d %s %f\n", name, &age, grade, &score);//这个要存入地址,
printf( "%s\t%d\t%s\t%f\n", name, age, grade, score);
}
fclose(fp3);
}
//a+:
//以追加、可读写的方式打开文件,允许读写。
//若进行读操作,则从头开始读;若进行写操作,
//则将内容添加在末尾。若文件不存在,则创建文件。
//打开成功后返回文件指针,位置指针指向文件头部。
//
//高级一点 常用到
#define MAXSIZE 100
typedef struct {
char name[10];
int age;
} ax;
typedef struct {
ax *elem;
int length;
} sqlist;
void geshihua() {
sqlist L;
L.elem = new ax[MAXSIZE];
FILE *fp4 = fopen("C:\\Users\\11446\\Desktop\\阿祥玩文件88.txt", "a+");//写 a+ yyds
if (fp4 == NULL) {
printf("失败\n");
return ;
}
//ax p = { "zhangsan", 18 };
//ax p;
//for (int i = 0; i < 1; i++) {
//scanf("%s%d 、\n", p.name, &p.age);//不理解为何要输入多一次无效的情况。原因找到了,这是如果后面有空格或者换行就会这样
int n = 0;
printf("\n\n请输入要输入几组数据\n");
scanf("%d", &n);
printf("请依次输入: 姓名 年龄 \n");
//写入
for (int i = 0; i < n; i++) {
scanf("%s%d", L.elem[i].name, &L.elem[i].age);
fprintf(fp4, "%s %d\n", L.elem[i].name, L.elem[i].age);//注意这里写入不用地址
}
rewind(fp4);
printf("读取内容如下:\n");
//读取
//for (int i = 0; i < n; i++) {
int i = 0;
while (!feof(fp4)) {
//在这里需要注意一个细节,下面这个fscanf后面要加个\n;不然会输出多一行出来才结束。
fscanf(fp4, "%s%d", L.elem[i].name, &L.elem[i].age);//而读取要存入地址,
printf("%s\t%d\n", L.elem[i].name, L.elem[i].age);
i++;
}
//}
fclose(fp4);
//pf = NULL;
}
int main() {
printf("阿祥玩文件操作\n");
duwenjian();
xieruwenjian();
duxiecaozuo();
//格式化输入,也就是对学生信息这类的操作进行输入和输出***
geshihuacaozuo();
//更完善的格式化输入
geshihua();
return 0;
}