fscanf只读取第一个字段C.

时间:2015-12-04 22:44:26

标签: c scanf

我正在做一项任务,我必须创建一个成绩报告程序。一切正常,但最后一节让我改变代码,以便从文件(student.dat)读取数据并将其用作输出数据。

student.dat示例(共有100行与此类似)。

Julius Hoffman,95,92,79,90,90
Dianne Conner,100,100,80,90,85
Mitchell Cooper,100,95,89,85,95

我的问题在于fscanf命令,因为它只读取名字

示例输出(最终程序总共有100行)

Please enter a filename: student.dat
Student Name      W(30%)   Q(15%)   T(20%)   P(15%)   E(20%)   TOTAL(100%) GRADE

Julius Hoffman    0        0        0        0        0         0.00         F              
                  0        0        0        0        0         0.00         F              
                  0        0        0        0        0         0.00         F  

处理文件读取的功能如下。

int read(char filename[], char name[][MAX_NAME_SIZE], float w[], float q[], float t[],float p[],float e[]){

    int i =0;

    FILE *fp = NULL;

    fp = fopen(filename, "r");

    if (fp != NULL) {

            for(i=0; i < MAX_CLASS_SIZE; i++){

                    fscanf(fp, "%[^,]%[^,]%[^,]%[^,]%[^,]%[^,]", name[i], w[i], q[i], t[i], p[i], e[i]);

            }
            fclose(fp);
    } else {
            printf("Failed to open file\n");
    }
    return 0;
}

以防万一,这是处理向用户呈现报告的功能

void display( char name[][MAX_NAME_SIZE], float w[], float q[], float t[], float p[], float e[], float total[], char grade[][MAX_LETTER_SIZE] ) {

    int i = 0;

    printf("Student Name      W(30%)   Q(15%)   T(20%)   P(15%)   E(20%)   TOTAL(100%)   GRADE\n===================================================================================\n");

    for(i = 0; i < MAX_CLASS_SIZE; i++){
            printf("%-15s   %-3.0f      %-3.0f      %-3.0f      %-3.0f      %-3.0f       %-3.2f         %-15s\n", name[i], w[i], q[i], t[i], p[i], e[i], total[i], grade[i]);
    }
}

感谢任何建议。

2 个答案:

答案 0 :(得分:1)

不匹配count_same_elements([1,2,3,4],[2,3,4,5]) => 3 格式说明符。将scanf()"%f"

一起使用

还可以节省调试时间。只需将该行读入缓冲区然后进行扫描即可。

float *扫描空白区域,然后将扫描索引保存到" %n"。因此,如果n,代码知道扫描的整行。如果n > 0,扫描没有在行尾完成。

buf[n]

答案 1 :(得分:0)

您的fscanf应如下所示:

fscanf(fp, " %[^,],%d,%d,%d,%d,%d", name[i], &w[i], &q[i], &t[i], &p[i], &e[i]);

注意:

  • %[^,]控件格式仅用于读取逗号前的字符。您没有理由为所有数据使用该控件格式(之后我想包含多个int)。
  • 您还应该检查fscanf的返回结果,确保它返回正确的值,在这种情况下,您一次只能从文本文件中读取6个值。