【发布时间】:2018-05-19 15:54:14
【问题描述】:
在调用此函数以从文件fe 中获取行时,有时该函数会工作并继续工作一段时间,直到它随机决定不再工作并且fgets() 开始返回@ 987654323@(我不允许使用 getline 作为替代)。
我尝试从头开始重新制作该功能,但它仍然不想工作。我百分之一地确定我的文件存在并且正在加载。
请原谅菜鸟代码,第二个月使用C。
int getEtudiants(FILE *fe, int *num, char nom[100][30],char pre[100][30],char sec[100][10]) {
FILE *p;
p = fe;
fseek(p, 0, SEEK_SET);
//char temp[5] = {0};
char *temp = (char*)malloc(sizeof(char) * 75);
int i = 0;
int lines = 0;
int ch;
int n = 0;
while((ch = getc(p)) != EOF) {
if(ch == '\n') lines++;
}
fseek(p, 0, SEEK_SET);
//printf("found %d students\n", lines);
char *lineBuffer = (char*)malloc(sizeof(char) * 75);
for(i = 0; i < lines; i++){
fgets(lineBuffer, 76, p);
strncpy(temp, lineBuffer, 5);
num[i] = atoi(temp);
strncpy(nom[i], lineBuffer + 5, 30);
trimStr(nom[i]);
strncpy(pre[i], lineBuffer + 35, 30);
trimStr(pre[i]);
strncpy(sec[i], lineBuffer + 65,10);
trimStr(sec[i]);
//printf("num: %d,%s %s section: %s\n", num[i], nom[i], pre[i], sec[i]);
fseek(p, 2, SEEK_CUR);
n++;
}
return n;
}
【问题讨论】:
-
如果你从不检查返回值,你怎么知道
fgets返回NULL?另外,fseek(p, 2, SEEK_CUR);有什么意义? -
Niggle:你分配了 75 个字节
char *lineBuffer = (char*)malloc(sizeof(char) * 75);但fgets(lineBuffer, 76, p);可以超过。 -
另外,你
malloc()而不是free(),所以你有内存泄漏。但是malloc完全没有必要——只需将temp和lineBuffer声明为char的普通数组(这样就不需要释放它们)。 -
顺便问一下,
fseek(p, 2, SEEK_CUR)在循环中的意义是什么?这很可疑。 -
"我确实检查了 fgets 的返回值,方法是使用 printf 打印出 lineBuffer" --> 不是 检查
fgets()的返回值。fgets()是一个有返回值的函数——检查一下。例如for(i = 0; i < lines && (fgets(lineBuffer, 75, p) != NULL); i++) {