【发布时间】:2015-12-14 19:09:15
【问题描述】:
我有作业。从使用格式的文本文件复制
name birthday street
NAME0;DAY/MONTH/YEAR;STREET0;
NAME1;DAY/MONTH/YEAR;STREET1;
NAME2;DAY/MONTH/YEAR;STREET2;
以上信息按年份排序。排序后,必须将所有内容复制到二进制文件中。它一直给我分段错误。我认为问题在于 token 用于从每一行读取所有信息。
编辑:
使用调试器,我发现 i=4 时的第 167 行会导致错误。 strcpy(stud[i].day,token);
编辑: 我认为问题出在输入文件中。我重新创建了,现在可以使用了。
void students_list(FILE *ifp , FILE *b_ifp)
{
char line[150] ;
char *token;
int i = 0 , n , t = 0 ;
memset(line,0,sizeof(line));
ifp = fopen("students.txt","r");
b_ifp = fopen("sorted.bin","wb");
struct students
{
char name[20] , street[50] , year[5] , month[3] , day[3];
};
typedef struct students students;
students stud[32], aux;
while(fgets(linie,sizeof(line), ifp) != NULL)
{
token = strtok(line,";");
strcpy(stud[i].name,token);
token = strtok(NULL,"/");
strcpy(stud[i].day,token);
token = strtok(NULL,"/");
strcpy(stud[i].month,token);
token = strtok(NULL,";");
strcpy(stud[i].year,token);
token = strtok(NULL,";");
strcpy(stud[i].street,token);
i++;
}
n = i;
while(t == 0)
{
t = 1;
for(i = 0 ; i < n ; i++)
{
if(strcmp(stud[i].year,stud[i + 1].year) > 0)
{
aux = stud[i];
stud[i] = stud[i + 1];
stud[i + 1] = aux;
t = 0;
}
}
}
for(i = 0; i < n ; i++)
{
fwrite(&stud[i], sizeof(stud[i]), 1, b_ifp);
}
fclose(ifp);
fclose(b_ifp);
}
【问题讨论】:
-
建议你使用调试器。至少它会立即告诉你哪条线路出现了段错误。
-
检查文件指针的有效性。
-
使用
strtok_r而不是strtok。 -
并找出导致段错误的行。您有任意数量的数组引用,这些引用可能会超出数组的末尾。
-
确定因为代码做了
n = i - 1;,最后的for()应该是for(i = 0 ; i <= n ; i++)否则最后一条记录不保存。但这并不能解决OP 的更大问题。
标签: c file segmentation-fault token binaryfiles