第一次使用后fscanf函数崩溃应用程序

时间:2017-01-17 21:35:30

标签: c file for-loop scanf fclose

如果我评论fprintf(pf,"1111");,exe会崩溃,如果我保留它,我会得到2/3/2011(只有第一条记录)。如果我尝试关闭文件,exe也会崩溃。

fscanf是否将行尾检测为文件末尾并读取为空?

我也试过关闭(* pf),它仍然崩溃。

fprintf不应该用在最终的代码中,我并不意味着使用它,但是当我使用它时,我观察到exe成功地读取了第一行

 Data* d;
fscanf(pf,"%d",&n);
d=calloc(n,sizeof(Data* ));
for(i=0;i<n;i++){
    if(fscanf(pf,"%d/%d/%d",&(d[i].zi),&(d[i].luna),&(d[i].an))!=3) break;
    printf("%d/%d/%d ",d[i].zi,d[i].luna,d[i].an);
       // fprintf(pf,"1111"); with this I observed that first data can be read

}
  fclose(pf);

输入

3
2/3/2011
2/2/2012
2/2/2016

3 个答案:

答案 0 :(得分:1)

欢迎使用C语言进行编程。

在C中,循环写成如下:

for( i = 0;  i < n;  i++ )

,就像这样:

for( i = 1;  i <= n;  i++ )

答案 1 :(得分:1)

除了程序中指出的其他错误之外,崩溃的真正原因是:一旦使用fprintf(),文件指针指向文件的末尾。所以基本上你在第二次调用时尝试在文件末尾使用fscanf,因此崩溃。要解决此问题,您可以在rewind()调用后使用fprintf,将文件指针倒回到先前的位置。

fscanf(pf,"%d",&n);
for(i=1;i<=n;i++){
    if(fscanf(pf,"%d/%d/%d",&(d[i].zi),&(d[i].luna),&(d[i].an))!=3) break;
    printf("%d/%d/%d ",d[i].zi,d[i].luna,d[i].an);
        fprintf(pf,"1111");
    }
    rewind(fp);
}
  fclose(pf);

编辑:正如评论中所指出的,这可能不是你想要的。更好的方法是跟踪到目前为止读取的字节数,并在使用fseek后使用fprintf到达您想要的位置。

答案 2 :(得分:0)

像这样解决:

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

typedef struct data {
    int zi, luna, an;
} Data;

int main(void){
    FILE *pf = fopen("data.txt", "r");
    if(pf == NULL){
        perror("fopen");
        return -1;
    }
    Data *d;
    int n;
    fscanf(pf, "%d", &n);
    d = calloc(n, sizeof(Data));//sizeof(Data* ) should be sizeof(Data)
    if(d == NULL){
        perror("malloc");
        return -2;
    }
    for(int i = 0; i < n; i++){//i <= n occurs out ouf bounds, In C 0 origin
        if(fscanf(pf, "%d/%d/%d", &d[i].zi, &d[i].luna,&d[i].an)!=3) break;
        printf("%d/%d/%d ", d[i].zi, d[i].luna, d[i].an);
    }
    fclose(pf);
    free(d);
}

DEMO