将.csv文件插入链接列表

时间:2016-08-27 03:25:06

标签: c struct linked-list

我正在尝试将.csv输入到我的链接列表中。但是,当我运行代码时 node-> stationID = atoi(strtok(buffer,“,”));行工作,但然后下一行给我一个“exc_bad_access”错误。如果我将其注释掉,则下一行会抛出错误,依此类推。在线查找错误,它说我必须指向不存在的内存分配。不知道如何解决这个问题。该文件的示例是:

STATION_ID,STATION_NAME,Handicap_Accessible,经纬度
40830,18th(Pink Line),TRUE,41.857908,-87.669147
40120,35th / Archer(Orange Line),TRUE,41.829353,-87.680622
41120,35th-Bronzeville-IIT(绿线),TRUE,41.831677,-87.625826

到目前为止我的代码:

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

//Struct array for file 1
struct CTAStations
{
    int stationID;
    char *stationName;
    char *handicap;
    float latitude;
    float longitude;
    struct CTAStations *next;

};
typedef struct CTAStations cta;

int main(int argc, const char * argv[])
{
    FILE *file;
    //FILE *file2;
    cta *current, *head;
    head = current = NULL;

    /*/For linked list in file2
    rider *rcurrent, *rhead;
    rhead = rcurrent = NULL; */

    //Open file 1
    file = fopen("stations.csv","r");

    /*/Open file 2
    file2 = fopen("ridership.csv", "r");
    if(file2 == NULL) {
        printf("Error! Could not open file. \n");
    }*/

    char buffer[64];

    memset(buffer, 0, 64);

    /*Testing to make sure file opens
    int c;
    file = fopen("stations.csv", "r");
    if (file) {
        while ((c = getc(file)) != EOF)
            putchar(c);
        fclose(file);
    }*/

    if(file != NULL) {

        while (!feof(file)) {

            cta *node = malloc(sizeof(cta));

            if(head == NULL){
                current = head = node;
            }
            else {
            current = current->next = node;
            }

            fgets(buffer, 64, file);

            node->stationID = atoi(strtok(buffer, ","));

            node->stationName = strdup(strtok(NULL, ","));

            node->handicap = strdup(strtok(NULL, ","));

            node->latitude = atoi(strtok(NULL, ","));

            node->longitude = atoi(strtok(NULL, ","));

             node->next = NULL;

        }
    }
    else
    {
        printf("ERROR!");
        return -1;
    }

    //free(buf);
    fclose(file);

    //free(buf);
    //fclose(file2);

    //printf("Hello World\n");

    return 0;
}

这是我点击此错误时显示的内容:

file = FILE * 0x7fff73da4050

node = cta * 0x100600140

buffer = char [64]“144 \ r \ n”

current = cta * 0x100600140

1 个答案:

答案 0 :(得分:0)

你的缓冲区是64字节。

您发布的输入文件片段的最后一行超过63个字符。

Fgets读取部分行,下次读取该行的最后一位。仅在最后一点没有足够的逗号,strtoks失败了,而且从那里开始走下坡路。

让你的缓冲区足够大以容纳你的行,并且在处理返回值之前总是检查你的strtoks是否成功。

还解释了为什么缓冲区是&#34; 144 \ r \ n&#34;在调试器中。它可能是该行前63个字符后文件中某行的结尾。

专业提示:在每次迭代中打印缓冲区的内容可能会让您快速完成此操作。步进调试器也可能有所帮助。诊断打印输出是您最好的工具之一,可以大量使用它们。

通过电话道歉打字错误。