#include <stdio.h>
#include <string.h>
#define stuSize 1 // define的时候 没有数据类型 也不用写; 符号!!!
void cpyFile(FILE *scource, FILE *dest);
void writeFile(char *str); //将控制台的文字写入文件
void getInfo();
void saveToDisk(char path[32]);
void checkFile(char path[32]);
void main() {
//将输入的信息写入文件
writeFile("D:/abc.txt");
//文件复制============================================
FILE *fp1;
FILE *fp2;
char filename[10]; //若想用 char *s 的形式 注意要用malloc分配空间
strcpy(filename, "D:/abc.txt"); // 变量名要写在前面 不能是 "xxx", filename
fp1 = fopen(filename, "r");
fp2 = fopen("D:/abc2.txt", "w");
cpyFile(fp1, fp2);
fclose(fp1);
fclose(fp2);
//写入二进制数据
getInfo();
char path[] = "D:/123123";
saveToDisk(path);
checkFile(path);
}
void writeFile(char *str) {
FILE *fp;
char ch; //本方法只能一个字一个字的写入文件 所以只能能定义成char
char filename[10];
strcpy(filename, str);
if ((fp = fopen(filename, "w")) == NULL ) {
} else { //getchar会将接收到的字符暂时放在缓冲区中 //回车后结束阻塞开始处理下面的语句 回车符本身也会放在缓冲区中
while ((ch = getchar()) != '\n') {
fputc(ch, fp);
}
}
fclose(fp);
}
void cpyFile(FILE *scource, FILE *dest) {
while (!feof(scource)) // 读取文件推荐用 feof() 作用是判断是否来到文件的末尾
{
fputc(fgetc(scource), dest);
}
}
//使用fread fwrite 写入Strut类型数据=================================================
struct Stu {
char stuname[20];
int no;
int age;
char addr[20];
} stus[stuSize]; //结构体数组 推荐这么做 最好不要像Java那样在后面写Stu stus={ xxx,xx,xx,xx}
void getInfo() {
int i = 0;
for (i = 0; i < 1; i++) {
printf("input info 4:");
scanf("%s", &stus[i].stuname); //scanf中只有一个要输入的参数//结束scanf的输入本身就是回车
//若格式定义成这样 scanf("%s\n"); 可能需要输入多次回车才有效果
scanf("%d", &stus[i].no);
scanf("%d", &stus[i].age);
scanf("%s", &stus[i].addr);
}
}
void saveToDisk(char path[32]) {
//printf("%s",path ); //ok
FILE *fp;
if ((fp = fopen(path, "wb")) == NULL ) { //wb write binary 写二进制文件
printf("%s", "can nnot find file");
return;
}
int i = 0;
for (i = 0; i < stuSize; i++) {
if (fwrite(&stus[i], sizeof(struct Stu), 1, fp) != 1) {
printf("%s", "write error");
}
}
fclose(fp);
}
void checkFile(char path[32]) {
FILE *fp;
if ((fp = fopen(path, "rb")) == NULL ) {
printf("%s", "wrong!!");
}
int i = 0;
for (i = 0; i < stuSize; i++) {
fread(&stus[i], sizeof(struct Stu), 1, fp);
}
fclose(fp);//流用完了还是要关闭的 否则会出现读不到数据的情况
}