C fgets工作,然后返回访问冲突

C fgets工作,然后返回访问冲突,c,C,我正在使用fgets()从文件中读取行。我能够读取文件的几行,然后fgets()返回访问冲突。人们可能会认为我的文件缓冲区有问题,但正如您在我的代码中看到的,情况并非如此。我注意到的一个奇怪的行为是,如果我在一个紧密的循环中阅读并打印文件的所有行,我就没有问题。我使用了一些printf()语句来调试这个问题,并注意到文件位置因执行的循环而异。在我的“全循环”逻辑中,没有触及文件* 紧循环文件位置为:0、27、53、80、82、99、127、155等 完整循环文件的位置为:0、27、53、80、8

我正在使用fgets()从文件中读取行。我能够读取文件的几行,然后fgets()返回访问冲突。人们可能会认为我的文件缓冲区有问题,但正如您在我的代码中看到的,情况并非如此。我注意到的一个奇怪的行为是,如果我在一个紧密的循环中阅读并打印文件的所有行,我就没有问题。我使用了一些printf()语句来调试这个问题,并注意到文件位置因执行的循环而异。在我的“全循环”逻辑中,没有触及文件*

紧循环文件位置为:0、27、53、80、82、99、127、155等

完整循环文件的位置为:0、27、53、80、82、99、138

输入文件:

!!!!!!!!!!!!!!!!!!!!!!!!!
! Test sparc gagdet file
!!!!!!!!!!!!!!!!!!!!!!!!!

! instruction 1
1: subcc     %g0, %i4, %i4
1: subc      %g0, %i4, %i4 ** access violation reading this line **

! instruction 2
** etc. **
代码:

/*
*parse_profile:解析gadget配置文件并加载扫描库文件所需的内存结构
*/
int parse_profile(文件*gadget_文件,结构g_句柄*gadget_句柄){
//用于临时存储文件输入的缓冲区
字符操作码[节点大小]=“\0”;
char reg[节点大小]=“\0”;
//参考bod_ops和save_regs列表中的节点
结构字符节点*临时节点=空;
struct char_node*op_node=NULL;
struct char\u node*reg\u node=NULL;
// 
智力水平=1;
int old_level=1;
int curr_line=0;
//保存文件数据的缓冲区
字符文件缓冲区[页面大小];
//在指令树中引用nocdes
结构指令\节点*当前\节点=空;
结构指令\节点*上一个\节点=空;
结构指令节点*prev\u level=NULL;
//从小工具文件中读取一行(单个指令的数据)
//while(fgets(文件缓冲区、页面大小、小工具文件)!=NULL){
char*shiz=文件缓冲区;
while(shiz!=NULL){
printf(“\n文件位置:%d”,ftell(gadget_文件));
fflush(stdout);
shiz=fgets(文件缓冲区、页面大小、小工具文件);
/*
//不同文件位置的紧密循环
while(该死!=NULL){
printf(“\n文件位置:%d”,ftell(gadget_文件));
fflush(stdout);
shiz=fgets(文件缓冲区、页面大小、小工具文件);
}
*/
//增加当前行
当前行=当前行+1;
printf(“\n行(%d)”,当前行);
fflush(stdout);
//确保我们已经收集了文件的整行内容
if(strlen(文件缓冲区)>=页面大小){
//我们已超过最大行大小,请退出
printf(“\n读取小工具配置文件时出错,第%d行:已超过4096的最大行长”,curr\u Line);
返回(-1);
}//确保已收集文件的整行内容
//如果这是一个评论
如果(*文件缓冲区=='!'){
//无所事事
}
//如果这是一个空行
else if(sscanf(文件缓冲区,“%s”)<1){
//无所事事
}
//扫描当前行,直到我们保存了所有说明
else if(sscanf(文件缓冲区,%d:%s,&级别,操作码)==2){
printf(“\n文件位置:%d”,ftell(gadget_文件));
fflush(stdout);
printf(“1”);
fflush(stdout);
//存储指令信息
/*      
注释块
*/
}//扫描当前行,直到保存所有指令/半字节对
//扫描当前行,直到我们保存了所有要保留的寄存器
否则如果(sscanf(文件缓冲区,“r:%s”,reg)==1){
/*
注释块
*/          
}//扫描当前行,直到保存所有要保留的寄存器
//扫描当前行,直到我们保存了所有要避免的操作单元代码
否则如果(sscanf(文件缓冲区,“o:%s”,操作码)==1){
/*
注释块
*/
}//扫描当前行,直到我们保存了所有要避免的操作码
否则{
//退出
printf(“\n读取小工具配置文件时出错,第%d行:\n%s”,当前行,文件缓冲区);
返回(-1);
}
printf(“7”);
printf(“\n文件位置:%d”,ftell(gadget_文件));
fflush(stdout);
}//从小工具文件中读取一行(单个指令的数据)
printf(“a”);
fflush(stdout);
//如果fread()返回错误,则退出并显示错误
如果(ferror(gadget_文件)!=0){
//打印错误并退出
printf(“\n读取小工具配置文件时出错”);
返回(-1);
}//如果fread()返回错误,则退出并返回错误
返回0;
}

行中有未定义的结果

else if(sscanf(file_buffer," %s ") < 1){
else if(sscanf(文件缓冲区,“%s”)<1){

格式说明符的数量超过了传递的指针的数量。
sscanf
很可能试图将扫描结果存储在位模式错误的任意位置。

看看是否可以将代码缩小到基本值。在使用
文件缓冲区之前,请检查fgets的返回值de>;在使用字符串函数(strlen等)之前,用“\0”终止
文件缓冲区
;整理代码使其可读(例如删除许多冗余注释,例如终止
}
)。然后再次尝试询问:-),解决了问题。谢谢!!
else if(sscanf(file_buffer," %s ") < 1){