有一个名为employes.dat
的文件包含按如下排序的数据:
Tremblay Alain A 35.0 35.5
Vachon Jean P 40.0 22.75
Lapalme Justin O 40.0 15.75
Deschenes Sylvie P 35.0 25.0
Lachance Carl O 37.5 18.0
Labonte Chantal P 40.0 20.0
Doucet Michel A 40.0 33.75
我想将名称,字母,数字1和数字2放入4个单独的表格中char names[]
,char letter[]
,float number1[]
和float number2[]
)。
我尝试使用此代码:
#include <stdio.h>
int main()
{
FILE *entree;
char nom[750], poste[30];
int i = 0;
float nbHeure[30], taux[30];
if(entree =fopen("employes.dat", "r")) {
fscanf(entree, "%30c %1c %4f %5f", &nom[i], &poste[i], &nbHeure[i], &taux[i]);
while(!feof(entree))
fscanf(entree, "%30c %1c %4f %5f", &nom[i+1], &poste[i+1], &nbHeure[i+1], &taux[i+1]);
fclose(entree);
}
else printf("Impossible d'ouvrir le fichier!");
printf("%c", nom[1]);
return 0;
}
但它不起作用...有人可以帮助我吗?它是一个家庭作业,我刚开始用C编程。不要为这个名字而烦恼,它的法语是fyi。
答案 0 :(得分:1)
像这样修复样本
#include <stdio.h>
int main(void){
FILE *entree;
char nom[30][25+1] ={{0}}, poste[30];
float nbHeure[30], taux[30];
int i = 0;
if(entree = fopen("employes.dat", "r")) {
while(i < 30 && 4==fscanf(entree, " %25c %c %f %f", nom[i], &poste[i], &nbHeure[i], &taux[i])){
++i;
}
fclose(entree);
int n = i;
for(i = 0; i < n; ++i)
printf("%s, %c, %.1f, %.2f\n", nom[i], poste[i], nbHeure[i], taux[i]);
}
else
printf("Impossible d'ouvrir le fichier!");
return 0;
}
结束修剪版。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *trimEnd(char *str){
if(!str || !*str)
return str;
char *endp = strchr(str, '\0');
while(isspace(*--endp)){
*endp = 0;
}
return str;
}
int main(void){
FILE *entree;
char nom[30][25+1] ={{0}}, poste[30];
float nbHeure[30], taux[30];
int i = 0;
if(entree = fopen("employes.dat", "r")) {
while(i < 30 && 4==fscanf(entree, " %25c %c %f %f", nom[i], &poste[i], &nbHeure[i], &taux[i])){
++i;
}
fclose(entree);
int n = i;
for(i = 0; i < n; ++i)
printf("%s, %c, %.1f, %.2f\n", trimEnd(nom[i]), poste[i], nbHeure[i], taux[i]);
}
else
printf("Impossible d'ouvrir le fichier!");
return 0;
}
答案 1 :(得分:0)
我修改了你的代码只做了很少的改动,所以你不会失去你最初的想法,我会解释我做了什么:
#include <stdio.h>
int main()
{
FILE *entree;
char nom[750], poste[30];
int i = 0;
int j = 0;
int k = 0;
float nbHeure[30], taux[30];
if(entree =fopen("employes.dat", "r")) {
fscanf(entree, "%25c %1c %4f %5f", &nom[j], &poste[i], &nbHeure[i], &taux[i]);
while(!feof(entree)) {
j = j + 25;
i = i + 1;
fscanf(entree, "%25c %1c %4f %5f", &nom[j], &poste[i], &nbHeure[i], &taux[i]);
if (!feof(entree)) {
} else {
j = j - 25;
i = i - 1;
}
}
fclose(entree);
}
else printf("Impossible d'ouvrir le fichier!");
printf ("%s \n \n", nom);
printf ("%s \n \n", poste);
for (k = 0; k < i; k++) {
printf ("%f ", nbHeure[k]);
}
printf("\n");
for (k = 0; k < i; k++) {
printf ("%f ", taux[k]);
}
return 0;
}
我已经宣布了另一个整数,j
int j = 0;
因为i整数将指向数组中一个元素大小为1的位置,并且j整数将指向数组中每个元素大小超过一个的位置(in我的情况,我认为,每个名字是25。让我举例说明:
如果j现在为0,我们在nom数组中写的下一个名字将从位置0开始。正确。
j = 0; fscanf(... %25c ... &nom[j]...);
这意味着从位置j = 0到位置j = 24(总共25个字符)的所有字符都将填充文件中的第一个名称。好
我们要写的下一个名字应该从前一个名字的结束位置开始。这恰好是25。为此,我们将j值增加25 j = j + 25; 现在,下一个单词将从j + 25开始写入j + 49。等等。
你会注意到我做的另一件事是添加这个:
if (!feof(entree)) {
} else {
j = j - 25;
i = i - 1;
}
从文件中读取时,您会在顶部询问文件是否结束了?(feof)。如果没有,继续阅读。但是直到你从文件中读取一个特殊的EOF字符,文件才会结束。当你阅读它时,你也会尝试写出名称,税和poste,这不是我们想要的。我写的if else只是避免从文件中读取最后一行,这类似于我告诉你的EOF。
最后,我为您的阵列添加了一些打印,以便您可以看到结果。
希望这会有所帮助。