读取文本数据或参数到结构体
我定义了这样一组结构:
typedef struct student//学生数据结构体声明
{
int number;//学号
int score[3];//平时、期末和总评成绩
}STUDENT;
我想将文本中的一组数据:
[studentinfo]
stuudentsum=3
[student1]
number=00001
score1=88
score2=99
[student2]
number=00002
score1=99
score2=86
[student3]
number=00003
score1=78
score2=65
[student4]
number=00004
score1=78
score2=56
[student5]
number=00005
score1=35
score2=78
[student6]
number=00006
score1=98
score2=76
[student7]
number=00007
score1=78
score2=65
(score3由score1、score2计算得出)读取到结构中,我下面是这么定义函数的:请给指点一下
void readinfo(int student_sum, int student_number, int student_score[])//从文本读取C 数据结构
{
FILE *pRF;
if(NULL == (pRF=fopen(STUDENT_FILE, "rb")))
{
printf("open false!");
return;
}
//下面不知道怎么分类读取里面的数据到结构了。
}
[解决办法]
你怎么写入文本STUDENT_FILE的,就怎么读出来呗
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
[解决办法]
vs下用GetPrivateProfileInt函数读取ini文件中的数据到int
如果是linux下,自己找个读ini文件的源代码
[解决办法]
没实际编译链接调试,不保证对,仅供参考:
//in.txt:
//[studentinfo]
//stuudentsum=3
//
//[student1]
//number=00001
//score1=88
//score2=99
//
//[student2]
//number=00002
//score1=99
//score2=86
//
//[student3]
//number=00003
//score1=78
//score2=65
//
//[student4]
//number=00004
//score1=78
//score2=56
//
//[student5]
//number=00005
//score1=35
//score2=78
//
//[student6]
//number=00006
//score1=98
//score2=76
//
//[student7]
//number=00007
//score1=78
//score2=65
#include <stdio.h>
#include <string.h>
typedef struct student {
int number;
int score[3];//平时、期末和总评成绩
} STUDENT;
STUDENT s[8];
FILE *f;
char t[40];
char n[40];
int i;
int main() {
f=fopen("in.txt","r");
if (NULL==f) return 1;
fgets(n,40,f);
fgets(n,40,f);
fgets(n,40,f);
i=1;
while (1) {
sprintf(t,"[student%d]",i);
if (1!=fscanf(f,t,n)) break;
if (1!=fscanf(f,"number=%d",&s[i].number)) break;
if (1!=fscanf(f,"score1=%d",&s[i].score[0])) break;
if (1!=fscanf(f,"score2=%d",&s[i].score[1])) break;
fgets(n,40,f);
fgets(n,40,f);
i++;
}
fclose(f);
for (i=1;i<=7;i++) {
s[i].score[2]=s[i].score[0]+s[i].score[1]
printf("[student%d] number=%d score1=%d score2=%d score3=%d\n",i,s[i].number,s[i].score[0],s[i].score[1],s[i].score[2]);
}
return 0;
}
[解决办法]
使用fread函数就可以,详见http://baike.baidu.com/view/656689.htm
(注:把结构体堪称一个和int一样普普通通的变量类型来处理就行)
[解决办法]
是否可以把
if (1!=fscanf(f,"number=%d",&s[i].number)) break;
if (1!=fscanf(f,"score1=%d",&s[i].score[0])) break;
if (1!=fscanf(f,"score2=%d",&s[i].score[1])) break;
合并成一句话
if ( 3!=fscanf(f,"number=%d\nscore1=%d\nscore2=%d",
&s[i].number,&s[i].score[0],&s[i].score[1]) ) break;
------解决方案--------------------
不能。题目没明确说明可以调换顺序。