#include
#include
struct Student
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];
void Save()
{
FILE *fp;
int i;
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("cann't open file");
return;
}
for(i=0;i<2;i++)
if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int main()
{
int i;
printf("Please enter data of student:\n");
for(i=0;i<2;i++)
scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
Save();
return 0;
}
说编码问题的都不是写C语言的,你写入结构体的时候,要把结构体数据成员,全部转成字符串写入文件,这样写入的文件才是给人看的,你那样写入是给机器看的
fwrite对int型的打印默认是以ASCII打印的,你这个不叫乱码,而是你写的数字对应的ASCII,建议把fwrite这一句改成fprintf(fp, "%s %d %d %s", stud[i].name, stud[i].num, stud[i].age, stud[i].addr)
写入的是数字吧,文本方式打开,要能看见得是字符啊,如写入0时需要给0+‘0’再写入文件才行,你用16进制软件打开你的文件应该就能看见你保存的数字了。
这个问题和我的差不多,我已经解决了,你可以访问我的博客,地址献上https://blog.csdn.net/Z1272633296/article/details/106947174
编码的问题,你在save函数中写入student中的各项值时,要注意string类型的编码。由于没用过C(我用C#时也出现过这种问题),只能给你点思路了。
看格式 保存进文件的时候
编码问题,一般是utf-8的。
结构体不能用文本文件存、你试试用二进制文件存储、再打开看看。
if((fp=fopen("stu.txt","wb"))==NULL)
模式问题,wb是表示二进制写入,所以是乱码,但并不会影响读到的信息。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Student
{
char name[10];
int num;
int age;
char addr[15];
} Student;
int load(const char *filepath, Student *students, int num, bool text)
{
if (!students || num <= 0)
{
return -1;
}
FILE *fp;
int i;
if(filepath)
{
if ((fp = fopen(filepath, "r")) == NULL)
{
fprintf(stderr, "Failed to open file %s\n", filepath);
return -2;
}
}
else
{
fp = stdin;
}
if (text)
{
for(i = 0; i < num; i++)
{
fscanf(fp, "%s %d %d %s", students[i].name, &students[i].num, &students[i].age, students[i].addr);
getc(fp);
}
}
else
{
fread(students, sizeof(Student), num, fp);
}
if (filepath)
fclose(fp);
return 0;
}
int save(const char *filepath, Student *students, int num, bool text)
{
if (!students || num <= 0)
return -1;
FILE *fp;
int i;
if(filepath)
{
if ((fp = fopen(filepath, "w")) == NULL)
{
fprintf(stderr, "Failed to open file %s\n", filepath);
return -2;
}
}
else
{
fp = stdout;
}
if (text)
{
for(i = 0; i < num; i++)
{
fprintf(fp, "%s %d %d %s\n", students[i].name, students[i].num, students[i].age, students[i].addr);
}
}
else
{
fwrite(students, sizeof(Student), num, fp);
}
if (filepath)
fclose(fp);
return 0;
}
void show(Student *students, int num)
{
int i;
printf("Students\n");
printf("Name\tNum\tAge\tAddr\n");
for (i = 0; i < num; i++)
{
printf("%s\t%d\t%d\t%s\n", students[i].name, students[i].num, students[i].age, students[i].addr);
}
}
int main()
{
int op = 1;
char filepath[64];
Student *students = NULL;
int num = 0;
int i;
bool text;
printf("Select your mode:\n");
printf("1. text [default]\t2. binary\n");
scanf("%d", &op);
switch(op)
{
case 1:
text = true;
break;
case 2:
text = false;
break;
default:
text = true;
break;
}
while (op > 0 && op < 5)
{
printf("Select your option:\n");
printf("1. Load from file\n");
printf("2. Save to file\n");
printf("3. Show data\n");
printf("4. Create data\n");
printf("5. Exit\n");
scanf("%d", &op);
getchar();
switch(op)
{
case 1:
printf("File path: ");
scanf("%s", filepath);
getchar();
printf("Students' num: ");
scanf("%d", &num);
getchar();
if (students)
free(students);
students = malloc(sizeof(Student) * num);
if (!load(filepath, students, num, text))
{
printf("Success\n");
}
else
{
printf("Fail\n");
}
break;
case 2:
printf("File path: ");
scanf("%s", filepath);
getchar();
printf("Students' num: ");
scanf("%d", &num);
getchar();
if (!save(filepath, students, num, text))
{
printf("SUccess\n");
}
else
{
printf("Fail\n");
}
break;
case 3:
show(students, num);
break;
case 4:
printf("Students' num: ");
scanf("%d", &num);
getchar();
if (students)
free(students);
students = malloc(sizeof(Student) * num);
load(NULL, students, num, true);
break;
default:
break;
}
}
return 0;
}
此代码段可以从文件导入数据,也可以保存到文件. 数据格式支持文本模式text, 也支持二进制模式binary.
需要注意的是字符串数据(name, addr)内部必须是连续的,不能包含空格, 否则导入数据可能解析出错.
好像你不能用记事本打开。
下载个文本编辑器 即可
你这个采用的是文件输入二进制格式输入,打开文件当然会是乱码,
if((fp=fopen("stu.txt","wb"))==NULL)
改成
if((fp=fopen("stu.txt","w"))==NULL)
for(i=0;i<2;i++)
if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
改成
for(i=0;i<2;i++) {
fprintf(fp , "%s %d %d %s\n" , stud[i].name , stud[i].num, stud[i].age, stud[i].addr) ;
}
#include "stdio.h"
struct Student
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];
void Save()
{
FILE *fp;
int i;
if((fp=fopen("c:\\stu.txt","wb"))==NULL)
{
printf("cann't open file");
return;
}
for(i=0;i<2;i++)
if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int main()
{
int i;
printf("Please enter data of student:\n");
for(i=0;i<2;i++)
scanf("%s%s%s%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);//这样就可以了,你试试
Save();
return 0;
}
编码的问题, 在文本文档右键另存为,然后将编码改为unicode格式保存,再打开就好了