很多大一新生到了期末做课设时,遇到文件操作。总会有人不明白为什么写入的内容会乱码。
先引入一些知识;
*文件有二进制文件,文本文件。
二进制文件是按内存写入的;
文本文件是按格式写入的;*
因此二进制文件用来写入一些不同类型的数据时 就容易出现 将下一个数据写到了上一个数据的内存中。
例如:int 型有四个字节。但是你写入1 时 只用了一个字节(八个位 00000001),后面本来属于int 的内存就会被后面一个要写入的数据给占有。
所以 用int的四个字节的二进制数转化成的字符就会乱码。
而文本文件是按格式写入写出的。也就是说,他保证了不会去占有别的数据的空间。因此不会出现乱码的情况。
说到这里 孰强孰弱 已经分晓。
我今晚有空,好奇把谭浩强c语言这本书上的例题代码,打了一遍。写入文件。结果竟然乱码了。呵呵,这。。。
#include<stdio.h>
#include<math.h>
struct stu
{
char name[10];
int num;
int age;
char add[15];
}A[2];
void save(){
FILE* fp;
int i;
if ((fp = fopen("stu.txt", "wb+")) == NULL)
{
printf("h");
return;
}
for (i = 0; i < 2; i++)
{
if (fwrite(&A[i], sizeof(struct stu), 1, fp) != 1)
printf("erroe");
}
fclose(fp);
}
int main()
{
int i;
for (i = 0; i < 2; i++)
{
scanf("%s%d%d%s", A->name, &A->num, &A->age, A->add);
save();
return 0;
}
}
下面根据自己的经验来说一下如何解决这个问题
fwrite 是根据二进制写入的函数
fprintf 则是按格式写入的函数。引用的格式这里就不说了。
看这篇文章可以写到更多
讲解fprintf
但是要注意:他们都有伴侣哦 不要拆散他们。
fprintf fscanf 一对 fwrite fread 一对
最好对应他们的另一半。交叉使用的话 可能不出错,但不保险。。
还有就是文件的使用方式
既然使用文本文件的函数 那么打开文件时也要对应的操作
这里推荐使用w+
好处就是 如果你没有你输入文件名这个文件,他会帮你建一个新的。
而且可读可写。不会乱码哟。
给一串代码做例子吧
void Save_massage2(struct stu* p_Head) {
FILE* p_File;
p_File = fopen("playerGrade.dat.txt", "w");
if (p_File == NULL) {
printf("打开文件失败\n");
return 0;
}
else
printf("本地保存成功\n");
struct stu* p = p_Head;
char s[100] = { "NAME\tNO.\t sco1 sco2 sco3 sco4 sco5 sco6 sco7 sco8 sco9 sco10 average\n" };
char s2[100] = { "---------------------------------------------------------------------------------------------\n" };
fprintf(p_File, "%s", s);
fprintf(p_File, "%s", s2);
while (p != NULL)
{
int i = 0;
fprintf(p_File, "%s\t", p->name);
fprintf(p_File, "%d\t", p->rank);
for (i = 0; i < 10; i++)
{
fprintf(p_File, "%6.2f", p->score[i]);
}
fprintf(p_File, "%6.2f\n", p->aver);
p = p->p_next;
}
fclose(p_File);
}
结果图片之前发过了
用按格式写入函数 对于文件内容也可以清晰排版 例如我这个格式:
可以看上面代码 如何实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)