将文件数据提取到4个单独的表

时间:2016-01-20 06:34:14

标签: c arrays file

有一个名为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。

2 个答案:

答案 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。

最后,我为您的阵列添加了一些打印,以便您可以看到结果。

希望这会有所帮助。