C语言中FILE结构问题

TC中
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
像这段定义 中的FILE,到底是结构体类型名,还是结构体变量名??

我来回答吧:
首先是两个输入文件:
一个文本文件:scoret.txt
一个二进制文件:scoreb.txt
文本文件scoret.txt我们可以直接编辑(按要求编辑五个学生的姓名和成绩),而二进制文件不易编辑。
我们先写一个代码,实再将scoret.txt文件转成二进制文件scoreb.txt
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct stu {
char name[30];
int grade;
};

int main()
{
int i,n;
struct stu s[10];
FILE *fpIt,*fpIb; /*输入*/
FILE *fpOt,*fpOb; /*输出*/

fpIt=fopen("scoret.txt","r");
fpIb=fopen("scoreb.txt","wb");
if (fpIt==NULL || fpIb==NULL)
{
printf("File Open Error:\npress any key to exit:\n");
getch();
return -1;
}

i=0;
while (!feof(fpIt))
{
fgets(s[i].name,30,fpIt); /*有空格只能这样输入*/
fscanf(fpIt,"%d\n",&s[i].grade); /*文本输入*/
printf("i=%d,name=%s\t grade=%d\n",i,s[i].name,s[i].grade);
getch();

fwrite(&s[i],sizeof(struct stu),1,fpIb);
i++;
}
n=i;
printf("n=%d\n",n);
fclose(fpIt);
fclose(fpIb);
getch();
return 0;
}

===============
上面的代码在TC或VC下编辑运行,就可以生成scoreb.txt文件。这时scoreb.txt的学生信息与scoret.txt是一样的。
接着就要修改一下scoret.txt文件的内容,重新编辑5个学生的信息给scoreb.txt
这样使得scoret.txt与scoreb.txt分别各有五个学生的信息。
当然你如果有原始文件的话,上面都是浮云。

下面是你这个问题的重点:
#include <mem.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct stu {
char name[30];
int grade;
};

int main()
{
int i,j,n;
struct stu s[10],temp;
FILE *fpIt,*fpIb; /*输入*/
FILE *fpOt,*fpOb; /*输出*/

fpIt=fopen("scoret.txt","r");
fpIb=fopen("scoreb.txt","rb");
fpOt=fopen("scoreOt.txt","w");
fpOb=fopen("scoreOb.txt","wb");

if (fpIt==NULL || fpIb==NULL || fpOt==NULL || fpOb==NULL)
{
printf("File Open Error:\npress any key to exit:\n");
getch();
return -1;
}

n=0;
while (!feof(fpIt))
{
fgets(s[n].name,30,fpIt); /*有空格只能这样输入*/
fscanf(fpIt,"%d\n",&s[n].grade); /*文本输入*/
printf("n=%d,name=%s\t grade=%d\n",n,s[n].name,s[n].grade);
getch();
n++;
}
fclose(fpIt);
printf("===========\n");
while (!feof(fpIb) && n<10)
{
fread(&s[n],sizeof(struct stu),1,fpIb);
printf("n=%d,name=%s\t grade=%d\n",n,s[n].name,s[n].grade);
getch();
n++;
}
printf("n=%d\n",n);
fclose(fpIb);

/*排序*/
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (s[i].grade<s[j].grade)
{ /*整个结构体复制,如果不用memcpy的话,要先复制name的内容和grade*/
memcpy(&temp,&s[i],sizeof(struct stu));
memcpy(&s[i],&s[j],sizeof(struct stu));
memcpy(&s[j],&temp,sizeof(struct stu));
}
for (i=0;i<n;i++)
printf("%d %s",s[i].grade,s[i].name);

/*写文件*/
for (i=0;i<5;i++)
fprintf(fpOt,"%s%d\n",s[i].name,s[i].grade);
fclose(fpOt);

for (i=5;i<10;i++)
fwrite(&s[i],sizeof(struct stu),1,fpOt);
fclose(fpOt);

getch();
return 0;
}

==============================
总结:
文本文件一般用:
读:fscanf函数或fgets函数,
写:fprintf函数即可(当然也可以用fputs函数)
二进制文件一般用:
读:fread函数
写:fwrite函数。

当然二进制文件你如果用记事本打开的话,一般是乱码。你可以弄一个UltraEdit之类的文本编辑器,查看其二进制代码。
2011年
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-11
类型名。可以用来声明具体的变量。 FILE fp1,fp2这样。
第2个回答  2011-09-11
类型名本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网