c语言中文件的读与写的问题,涉及fscanf,fwrite函数 程序如下 (先上30分,回答的好再加分)

首先说明,开始提了一个一样的问题,后来问题失效了(我已经去投诉了),希望之前回答了我的问题的大侠再回答一次,因为我要把这个问题记录下来,谢谢!
程序:
#include<stdio.h>
#include<stdlib.h>
struct student
{
char name[20];
char sex[6];
char num[15];
int score[3];
};
int main()
{
struct student stud[4];
FILE *fp;
int i,j;
char tit[6][20]={"Name","Sex","Num","Math","English","Computer"};
fp=fopen("in.txt","r");
if(fp==NULL)
{
printf("File cannot open");
exit(0);
}
for(i=0;i<4;i++)
{
fscanf(fp,"%s%s%s",stud[i].name,stud[i].sex,stud[i].num);
for(j=0;j<3;j++)
fscanf(fp,"%d",&stud[i].score[j]);
}
fclose(fp);
printf("\n%15s%8s%20s%9s%9s%9s",tit[0],tit[1],tit[2],tit[3],tit[4],tit[5]);
for(i=0;i<4;i++)
{
printf("\n%15s%8s%20s",stud[i].name,stud[i].sex,stud[i].num);
for(j=0;j<3;j++)
printf("%7d",stud[i].score[j]);
}

fp=fopen("out.txt","wb");
if(fp==NULL)
{
printf("File cannot open");
exit(0);
}
for(i=0;i<4;i++)
fwrite(&stud[i],sizeof(struct student),1,fp);
fclose(fp);
return 0;

}
in.txt内容为:
li_ming man 201107020301 89 78 67
wang_hui women 201107020302 87 98 86
li_li man 201107020303 67 78 69
mao_dong man 201107020304 78 86 89

问题:把读到的4个数据块写入out.txt文件中,按"w"和"wb"两种方式写入数据块,然后打开被写的文件out.txt,内容为:
li_ming 烫烫烫烫烫烫man 烫201107020301 烫烫蘗 N C wang_hui 烫烫烫烫烫蘷omen 201107020302 烫烫蘔 b V li_li 烫烫烫烫烫烫烫man 烫201107020303 烫烫藽 N E mao_dong 烫烫烫烫烫兰an 烫201107020304 烫烫蕴 V Y

问题一:
即按"w"和"wb"方式写入数据块,打开被写文件,发现内容完全一样,有一部分乱码,也有一部分具有可读性。"w"写文件应该具有可读性,”wb“写文件应该不具备可读性啊?

问题二:
fscanf以空格或换行符结束,所以我设计in.txt中每行的各个数据之间用空格隔开。后来我试着把in.txt中每行的各个数据之间用3个,用5个空格隔开,那么程序运行结果就不会是正确的了。可是运行程序后的结果依然是正确的。
fscanf不是以空格或换行符结吗?

问题三
li_ming man 201107020301 89 78 67

对应
li_ming 烫烫烫烫烫烫man 烫201107020301 烫烫
li_ming man 201107020301中间多出的” 烫烫烫烫烫烫“是什么?

问题四
第二句wang_hui women 201107020302 87 98 86
对应
wang_hui 烫烫烫烫烫蘷omen 201107020302 烫烫蘔

其中women显示不完整,少了一个"w"字母,这是为什么(第四句也是一样的情况)?

很简单 所有的问题都冲我来吧

1 不管是什么 w也好 wb也好 你写的时候用的是fwrite 就是二进制写入

必须要用fread来读入,直接打开文件看 有乱码很正常

当然 如果你能在给结构体赋值前把结构体内容初始化一下 就没有乱码了

2 fscanf 跟scanf一样的 多少个空格都按一个算

不以空格换行 是流的模式 你懂吗

3 见我1里面的回答 不是楼下说的越界 而是你的字符串没有初始化的部分

举例子 结构体力的name[20] 赋值wangwei的话 那么 只有 wangwei\0 其余部分全是乱码

4 这个问题你要具体单步调试着看了

5 百度的投诉 没什么用 尤其是吞了问题这些
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-10
b和可读与否没有任何关系,它只决定了是否把\n翻译成\r\n,不要根据字面胡乱猜测,你应该看fwrite之类的函数的MSDN说明了解真实含义

问题二以测试标准为准吧。不要在这上面耽误过多的时间,一次读入所有文本,然后进行自己分割,似乎更可靠点
问题3:烫烫烫烫烫烫表示你的字符串很可能没有结束的\0导致读写越界
问题4:这和少一个w没有关系,这是因为前面显示不正确,导致w处混乱了。如果你没有烫之类的问题,就不会有问题

用这种文本格式存储会增加很多不确定性,尤其当你自己对scanf也不熟悉的情况下。尝试用二进制存储或者xml存储
第2个回答  2012-09-12
使用fwrite写入文件,是结构体一样直接写入 就是基于二进制的,然后你直接打开.txt,有的是无法解析的,你就会看到乱码,然后你可以按照结构体的形式读出来,看看填充的结构体是不是还是乱码

c语言中文件的读与写的问题,涉及fscanf,fwrite函数 程序如下 (先上30...
1 不管是什么 w也好 wb也好 你写的时候用的是fwrite 就是二进制写入 必须要用fread来读入,直接打开文件看 有乱码很正常 当然 如果你能在给结构体赋值前把结构体内容初始化一下 就没有乱码了 2 fscanf 跟scanf一样的 多少个空格都按一个算 不以空格换行 是流的模式 你懂吗 3 见我1里面的...

C语言——关于【文件读写】的问题。
int main(void){ FILE *fp1,*fp2;float dt;fp1=fopen("c:\\\\shuju.txt","r"); \/*打开shuju.txt文件*\/ if (fp1) { fp2=fopen("c:\\\\jieguo.txt","w"); \/*打开jieguo.txt文件*\/ while (fscanf(fp1,"%f",&dt)!=EOF) \/*从shuju.txt文件读取数据,直到到达文件结尾为止...

关于C语言读取文件及fscanf函数的问题
FILE *stream:文件指针;char *format:格式字符串;[argument...]:输入列表。例如:FILE* fp;char a[10];int b;double c;fscanf(fp , "%s %d %lf" , a , &b , &c);和scanf一样,格式化串的空格不代表读取的子串有空格,存放读取数据的参数都是指针。扩展阅读,C语言中文件的读取和写...

C语言中fscanf()的用法
功 能: 从一个流中执行格式化输入\\x0d\\x0a 用 法: int fscanf(FILE *stream, char *format,[argument...]);\\x0d\\x0a int fscanf(文件指针,格式字符串,输入列表);\\x0d\\x0a 返回值:整型,数值等于[argument...]的个数\\x0d\\x0a 程序例:\\x0d\\x0a #include \\x0d\\x...

C语言文件读写结构体里面的数据怎样存到磁盘文件上
fwrite(&v, sizeof(v), 1, fp); \/\/写入文件。 fclose(fp);\/\/关闭文件。 return 0;}当需要读取的时候,按照类似的流程,通过fread读取即可。该操作优势为:a 代码简单。b 存储的数据文件大小固定,就是结构体占用内存空间的整数倍。这样在读的时候就可以根据文件的大小直接判断出一共存储...

c语言 用fwrite写入txt的文件,为什么是一堆乱码呢 ,下面是我的程序
FILE *fp; \/\/写入if((fp=fopen("database.txt", "w"))==NULL) return; fprintf(fp,"%s\\t", name); \/\/读 if((fp=fopen("database", "r"))==NULL){printf("Read error");return;} fscanf(fp,"%s\\t", sname);fclose(fp);...

C语言如何实现对txt文件的读取和写入
1、使用VS新建空工程,直接点击确定,如下所示。2、新建c文件,用于C语言编译器,输入main.c文件,如下所示。3、参考代码:include <stdio.h> int main(){ \/\/下面是写数据,将数字0~9写入到data.txt文件中 FILE *fpWrite=fopen("data.txt","w");if(fpWrite==NULL){ return 0;} for(int...

fwrite()函数和fread()函数分别有几个返回值?分别代表什么意思?(C语...
fwrite(s,sizeof(struct test),nmemb,stream);fclose(stream);} 执行 参考fread()。fread(从文件流读取数据)相关函数 fopen,fwrite,fseek,fscanf 表头文件 #include<stdio.h> 定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);函数说明 fread()用来从...

用C语言fscanf()一运行就出错~怎么回事呀~
fopen的参数问题,你把r改成w,r是对文件的读,不能进行写操作 FILE*fin = fopen("file_in.txt","w");"w“是文件写的操作

关于C语言中,链表数据的文件储存和提取。
按照问题要求的代码如下:Consumer* read_list(){ FILE *fp;if ((fp = fopen("CONSUMER.dat", "rb")) == NULL){ printf("无法读取 CONSUMER.dat\\n");return NULL;} int sign;Consumer *s,*p,*head;head= (Consumer*)malloc(SIZE_C);if (head == NULL){ printf("读取失败!内存空间...

相似回答