首次使用后函数 fscanf 崩溃应用程序
Function fscanf crash app after first use
如果我评论 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
欢迎使用 C 编程。
在C语言中,循环是这样写的:
for( i = 0; i < n; i++ )
不是这样的:
for( i = 1; i <= n; i++ )
除了你程序中指出的其他错误外,崩溃的真正原因是:一旦你使用fprintf()
,文件指针指向文件末尾。所以基本上你试图在你的第二次调用中的文件末尾使用 fscanf
,因此崩溃。要解决此问题,您可以在 fprintf
调用后使用 rewind()
,这会将文件指针倒回到之前的位置。
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);
编辑:正如评论中所指出的,这可能不是您想要的。更好的方法是跟踪到目前为止读取的字节数,并在使用 fprintf
.
后使用 fseek
到达您想要的位置
像这样修复:
#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);
}
如果我评论 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
欢迎使用 C 编程。
在C语言中,循环是这样写的:
for( i = 0; i < n; i++ )
不是这样的:
for( i = 1; i <= n; i++ )
除了你程序中指出的其他错误外,崩溃的真正原因是:一旦你使用fprintf()
,文件指针指向文件末尾。所以基本上你试图在你的第二次调用中的文件末尾使用 fscanf
,因此崩溃。要解决此问题,您可以在 fprintf
调用后使用 rewind()
,这会将文件指针倒回到之前的位置。
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);
编辑:正如评论中所指出的,这可能不是您想要的。更好的方法是跟踪到目前为止读取的字节数,并在使用 fprintf
.
fseek
到达您想要的位置
像这样修复:
#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);
}