我正在尝试将.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
答案 0 :(得分:0)
你的缓冲区是64字节。
您发布的输入文件片段的最后一行超过63个字符。
Fgets读取部分行,下次读取该行的最后一位。仅在最后一点没有足够的逗号,strtoks失败了,而且从那里开始走下坡路。
让你的缓冲区足够大以容纳你的行,并且在处理返回值之前总是检查你的strtoks是否成功。
还解释了为什么缓冲区是&#34; 144 \ r \ n&#34;在调试器中。它可能是该行前63个字符后文件中某行的结尾。
专业提示:在每次迭代中打印缓冲区的内容可能会让您快速完成此操作。步进调试器也可能有所帮助。诊断打印输出是您最好的工具之一,可以大量使用它们。
通过电话道歉打字错误。