#include<stdio.h>
#include <string.h>
int main()
{
FILE* pf;
errno_t err= fopen_s(&pf,"C:\\C语言\\test_24_3_6\\test.txt", "r");//文件存在硬盘,内存中有文件信息区,是FILE类型;维护时需要一个指针变量pf,pf类型是FILE*,
//fopen_s打开文件成功返回0,失败返回非0,VS2022版本fopen不安全,所以只能用fopen_s
//写文件
//char i = 0;
//for (i = 'a';i <= 'z';i++)
//{
// fputc(i, pf);//fputc写入
//}
//读文件
/*int ch = fgetc(pf);
printf("%c\n", ch);*/
/*int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}*/
//写一行数据
//fputs("hello world", pf);//写文件时如果文件中有内容,他会把文件中的内容全部清空,再写数据
//如果不想清空,就用a,a是追加
//再写一行数据在文本中显示的是在同一行也就是追加并没有换行,如果想换行需要自己加\n 例如:fputs("hello world\n", pf);
//读一行数据
//char arr[20];
//fgets(arr, 20, pf);
//printf("%s\n", arr);//输出hell,因为fgets读一行会自己加个\0,所以读5个时是:hell\0
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
//以结构体格式写数据
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
struct S
{
char arr[10];
int age;
float score;
};
//int main()
//{
// struct S s = { "zhangsan",25,50.5f };
// FILE* pf;
// errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "w");
// fprintf(pf,"%s %d %f",s.arr,s.age,s.score);
// fclose(pf);
// pf = NULL;
// return 0;
//}
//以结构体格式读数据
int main()
{
struct S s = {0};
FILE* pf;
errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "r");
if (pf != NULL)
{
fscanf_s(pf, "%9s %d %f", s.arr, _countof(s.arr), &(s.age), &(s.score));
//这块我一开始自己写错了,上面是大佬更正的程序
//将fscanf_s调用进行了调整,给字符数组s.arr添加了缓冲区大小参数_countof(s.arr)。这样可以确保在读取字符串时不会超出数组容量,从而避免潜在的安全风险。
//另外,我还增加了对打开文件失败情况的处理,如果fopen_s返回非零值,则会输出错误信息。这样有助于调试和了解程序运行过程中可能遇到的问题。请注意,您的文本文件内容应与结构体成员变量匹配,即文件中应该是一个不超过9个字符的字符串、一个整数和一个小数,各部分之间以空格分隔。
printf("%s %d %f\n", s.arr, s.age, s.score);
fclose(pf);
}
else
{
perror("Failed to open file");
}
return 0;
}
//流
// FILE*
//
// printf
// scanf
//
//任何一个C语言程序只要运行起来就会默认打开三个流
// FILE* stdin ->标准输入流(键盘)
// FILE* stdout ->标准输出流(屏幕)
// FILE* stderr ->标准错误流(屏幕)
//
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
struct S
{
char arr[10];
int age;
float score;
};
//以二进制形式写文件
//int main()
//{
// struct S s = { "zhangsan",25,50.5f };
// FILE* pf;
// errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "wb");
// if (pf == NULL)
// {
// perror("fopen");
// return 1;
// }
// //二进制的方式写
// fwrite(&s, sizeof(struct S), 1, pf);//把&s的数据以大小为sizeof,一次写一个,写到pf流里面去
// fclose(pf);
// pf = NULL;
// return 0;
//}
//二进制方式读
int main()
{
struct S s = {0 };
FILE* pf;
errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "rb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//二进制的方式读
fread(&s, sizeof(struct S), 1, pf);//把&s的数据以大小为sizeof,一次读一个,这是一次读一个结构体大小
printf("%s %d %f\n", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}