分配内存并从文件中读取输入到结构数组

时间:2013-04-24 06:23:18

标签: c file memory-management structure

我有关于从文件到结构读取数据的问题 当我尝试运行此代码时,我得到未处理的异常访问冲突读取位置0xcccccce0,getData函数内部发生错误,为什么我收到此错误,我该如何修复代码?

这是我的输入文件

4
A,10
B,12
C,60
D,120
tutorY

我在getData函数中的意图是首先读取第一行然后获取第4行,然后使用该数字为学生结构分配,然后将该文件的下四行读入学生结构字段,然后阅读在TUTOR结构中最后一行进入tutorname feild。

提前谢谢

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "queue.h"
    #include "stack.h"

    #define RECORDS_SIZE 100
    #define NAME_SIZE    20

    typedef struct Student
    {
        char nameStudent[NAME_SIZE];
        int  TimeIn;
        int  TimeUpdate;
    }STUDENT;

    typedef struct TUTOR
    {
        char nameTutor[NAME_SIZE];
        int TutorTIme;
        STUDENT *ptr;
    }TUTOR;


    QUEUE *queue1;
    STACK *stack1;

    void getData(STUDENT *studentArr[RECORDS_SIZE], TUTOR tutorArr[1]);

    int main (void)
    {

        STUDENT *studentArr[RECORDS_SIZE];
        TUTOR tutorArr[1];
        FILE *fp = NULL;

        getData(studentArr, tutorArr);

        return 0;
    }


    void getData(STUDENT *studentArr[RECORDS_SIZE], TUTOR tutorArr[1])
    {
        FILE *fp;
        char fileName[NAME_SIZE];
        char buffer[RECORDS_SIZE];
        int first = 0;
        int count = 1;

        printf("Enter file name: ");
        gets(fileName);
        fp = fopen(fileName, "r");
        if (fp == NULL)
        {
           printf("Error! The file does not exist!\n");
        }

        fscanf(fp,"%d",&first);
        *studentArr = (STUDENT*) malloc(first*sizeof(STUDENT));
        while( fgets(buffer, first +1, fp) != NULL)
        {          
           if (count <= first)
           {
              sscanf(buffer, "%[,]%d", studentArr[count]->nameStudent, studentArr[count]->TimeIn);
              printf("%s,%d", studentArr[count]->nameStudent, studentArr[count]->TimeIn);  
           }
           else
              sscanf(buffer, "%s", tutorArr[count].nameTutor);
               count++;
        }

        return;
    }

3 个答案:

答案 0 :(得分:2)

我发现了一些问题。

  1. 首先读取第一个fscanf将读取第一个数字,然后通过第一次调用fgets接收剩下的行(“\ n”)

  2. 更重要的是,studentArr是一个指针数组,可能是每个学生的一个元素,但malloc只分配sudentArr中的第一个指针,所有其他指针都包含垃圾,导致访问冲突。

答案 1 :(得分:0)

还有一些问题:

  1. count应该初始化为0而不是1,因为你的数组是零索引的。
  2. 您没有在循环中递增count
  3. 使用studentArr[count] = new Student();
  4. 为循环内的每个学生分配内存
  5. 首选strtok到sscanf`将缓冲区拆分为字段。在字符串后面处理逗号会容易得多。

答案 2 :(得分:0)

像这样修复

void getData(STUDENT **studentArr, TUTOR tutorArr[1]);//change

int main (void)
{

    STUDENT *studentArr;//change
    TUTOR tutorArr[1];
    FILE *fp = NULL;//not use

    getData(&studentArr, tutorArr);//change

    return 0;
}


void getData(STUDENT **studentArr, TUTOR tutorArr[1])
{
    FILE *fp;
    char fileName[NAME_SIZE];
    char buffer[RECORDS_SIZE];
    int first = 0;
    int count = 1;

    printf("Enter file name: ");
    gets(fileName);//has risk
    fp = fopen(fileName, "r");
    if (fp == NULL)
    {
       printf("Error! The file does not exist!\n");
       return;//add, can't continue
    }

    fscanf(fp,"%d\n",&first);//add, consumption '\n'
    *studentArr = (STUDENT*) malloc(first*sizeof(STUDENT));
    while( fgets(buffer, RECORDS_SIZE, fp) != NULL)//change buffer size
    {          
       if (count <=first)//
       {
          sscanf(buffer, "%[^,],%d", (*studentArr)[count-1].nameStudent, &(*studentArr)[count-1].TimeIn);//add, `,` and -1 to count is 1 origin, `&` need for "%d" 
          printf("%s,%d\n", (*studentArr)[count-1].nameStudent, (*studentArr)[count-1].TimeIn);  
          ++count;//need count up
       }
       else
          sscanf(buffer, "%s", tutorArr[0].nameTutor);
    }

    return;//need allocate record size return to main
}