2016-12-04 97 views
0

在这个程序中,我想读一个records.ssv的文件并使用结构数组打印出来。但是在打印数组之前要计算平均值。该文件包含学生姓名,身份证,考试1,考试2,项目1,项目2,平均和成绩(字母,单个)。打印一个结构数组

当前在打印出eh数组和计算平均值时出现问题。我将发布我的代码并在下面输出。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct { 
     char name[25]; 
     int I_D[9]; 
     int exam[2]; 
     int project[2]; 
     char grade; 
     float avg; 
} STUDENT; 

void printStuAry(int size, STUDENT stuAry[]); 

int main(void) 
{ 
    STUDENT stuAry[5]; 

    FILE* f = fopen("records.ssv", "r"); 
    if (f == NULL) { 
      printf("Error opening file records.ssv.\n"); 
      exit(1); 
    } 

    char line[65]; 
    int ind = 0; 

    while (fgets(line, sizeof(line), f) != NULL) { 
     sscanf(line, "%25[^,] ; %d ; %d ; %d ; %d ; %d ; %c", 
       stuAry[ind].name, 
       &stuAry[ind].I_D, 
       &stuAry[ind].exam[0], 
       &stuAry[ind].exam[1], 
       &stuAry[ind].project[0], 
       &stuAry[ind].project[1], 
       &stuAry[ind].grade); 
     ind++; 
    } 
    // calculates average 
    stuAry[ind].avg = (stuAry[ind].exam[0] + stuAry[ind].exam[1] + 
         stuAry[ind].project[0] + stuAry[ind].project[1]) /4.0; 

     printf("\t+---------+-------+-------+-------+---------+----------+----------+------+\n"); 
    printf("\t| Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade|\n"); 
    printf("\t+---------+-------+-------+-------+---------+----------+--------+--------+\n"); 

    printStuAry(5, stuAry); 
    if (fclose(f) == EOF) { 
     printf("Error closing file records.ssv.\n"); 
     exit(2); 
    } 

    int letter; 
    printf("Enter grade letter to search and q to quit"); 
    scanf("%d", letter); 

    while (letter != -1){// tests for whether user wants to end program 
     printStuAry(5, stuAry); 
    } 

    return 0; 
} 

/* 
*Function name: printStuAry 
* 
*Input Parameters: int size Student Ary 
* 
*Desription: prints out student Ary 
*                 
*Return value: 0 
*/ 

void printStuAry(int size, STUDENT stuAry[]) 
{ 
     for (int i=0; i<size; i++) { 
       printf("\t| %d  | %s | %d | %d | %d  | %d | %d  | %c |\n", //displays student information 
             i, stuAry[i].name, stuAry[i].exam[0], 
             stuAry[i].exam[1], stuAry[i].project[0], 
             stuAry[i].project[1], stuAry[i].avg, 
             stuAry[i].grade); 
     } 
} 

输出

 +---------+-------+-------+-------+---------+----------+----------+------+ 
     | Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade| 
     +---------+-------+-------+-------+---------+----------+--------+--------+ 
     | 0  | Panzer | -544760936 | 32568 | -544762280  | 32568 | -27  |   | 
     | 1  | Basler | -1718237240 | 32767 | -544747128  | 32568 | -104  |   | 
     | 2  | Leaton | -1718237400 | 32767 | 118  | 0 | 9  |   | 
     | 3  | Bishop | 4195301 | 0 | 194  | 0 | 62  |   | 
     | 4  | Lucey | -1718237064 | 32767 | 4197349  | 0 | -96  |   | 
Enter grade letter to search and q to quit 

正确的输出应该是什么:

原文:

+-------------------------+--------------+------+------+---------+---------+-------+-----+ 
| Student Name|Identification|Exam 1|Exam 2|Project 1|Project 1|Average|Grade| 
+-------------------------+--------------+------+------+---------+---------+-------+-----+ 
| Holtkamp, Norman| N21102485| 83| 61| 62| 78| 71.00| C| 
| Bellomy, Shavonda| N94185259| 74| 96| 80| 98| 87.00| B| 
| Clutter, Loris| N68760306| 83| 68| 93| 70| 78.50| C| 
| Rountree, Edythe| N76813896| 98| 91| 90| 81| 90.00| A| 
| Waldeck, Marylee| N44293872| 88| 100| 70| 87| 86.25| B| 
+-------------------------+--------------+------+------+---------+---------+-------+-----+ 
+0

请妥善不知疲倦更换sscanf(line, "%25[^,] ; %d ; %d ; %d ; %d ; %d ; %c", nt你的代码。事实上,这让阅读变得更加困难。 – e0k

+0

这一切都不清楚?你是否声称'%c'打印了你一个数字而不是一个字符?无论哪种方式可能是结构中错误的值。注意,这也不像你在你的函数中打印ID。另外为什么是整数ID数组而不是字符串(字符数组)?更何况你只是读取它的第一个单元格的值(I_D [0]),而不是每个数字,因为你提到%d到sscanf –

+0

另外,我建议检查你的'sscanf()'的返回值确保所有内容都被正确读取。 – e0k

回答

0

尝试用sscanf(line, "%25[^,] %d %d %d %d %d %c",

+0

但是文件数据是用分号分隔的,想想如果我在sscanf中使用分号,它会更准确 – josmar

+0

在这种情况下,您需要将行读入变量并使用strtok方法按分隔符分割。请参阅http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c – Sourabh