嗨首先让我准确一点,我有一个以下格式的数据文件:
第一行包含一个字符串,后跟三个整数和一个float数据类型。
第二行包含带有空格的字符串,后跟三个整数和一个浮点数据类型
最后一行包含一个字符串,后跟三个整数和一个float数据类型。
我的目的是读取这些数据并分配给一个结构数组,一个数组中的结构包含一行字符串,3个整数和一个浮点数。
我使用以下代码绑定并成功读取了一行,其中字符串没有空格,但无法读取带空格的字符串:
void readFromDatabase(struct student temp[], int *no) {
FILE *filepointer;
int i = 0;
if ((filepointer = fopen("database", "r")) == NULL) {
printf("Read error");
return;
}
while (fscanf(filepointer, "%10s\t%d%d%d%f\n", temp[i].name,
&temp[i].birthday.date, &temp[i].birthday.month,
&temp[i].birthday.year, &temp[i].gpa) != EOF && i < MAX_CLASS_SIZE) {
++i;
}
*no = i;
fclose(filepointer);
}
我得到了意外的输出:
我试图遍历结构数组并以上述格式显示数据。
但是我没有获得3行输出,而是获得了4行。
我真的需要一些关于这个主题的帮助。
提前谢谢......
我在ubuntu 16.04下使用gcc来编译和执行程序..
答案 0 :(得分:1)
在fscanf
格式字符串中,使用%10[^\t]
代替%10s
。这会匹配名称的每个字符,直到制表符分隔符。
不幸的是,你没有举一个完整的例子,所以这是我在Ubuntu 16.04上测试的小程序:
#include <stdio.h>
#include <stdlib.h>
#define MAX_CLASS_SIZE 4
struct student {
char name[11];
struct {
int date;
int month;
int year;
} birthday;
float gpa;
};
int main(void) {
FILE *filepointer;
int i = 0;
int no;
struct student temp[MAX_CLASS_SIZE];
if ((filepointer = fopen("data.txt", "r")) == NULL) {
printf("Read error");
return EXIT_FAILURE;
}
while (fscanf(filepointer, "%10[^\t]\t%d%d%d%f\n", temp[i].name,
&temp[i].birthday.date, &temp[i].birthday.month,
&temp[i].birthday.year, &temp[i].gpa) != EOF && i < MAX_CLASS_SIZE) {
++i;
}
no = i;
fclose(filepointer);
for(i = 0; i < no; i++) {
printf("%s: %d-%d-%d %f\n",
temp[i].name,
temp[i].birthday.date, temp[i].birthday.month, temp[i].birthday.year,
temp[i].gpa
);
}
return EXIT_SUCCESS;
}
根据您的格式字符串,我假设您的数据库中的所有值都由制表符分隔。