C fgets函数返回错误的值
我的文件的第一行如下所示:C fgets函数返回错误的值,c,file,C,File,我的文件的第一行如下所示: AXX00.data 但当我调用下面的函数时,它将XX00.data存储在ll中 fgets(ll,10,keysFile); 为什么会发生这种奇怪的事情?请检查下面的代码。但实际上,整个代码可能会让您感到困惑,这就是为什么我以前没有保留它,但为了消除一些困惑,我正在用代码编辑我的问题 。。。。正在请求时放置完整的代码 #include <stdio.h> #include <string.h> #include &
AXX00.data
但当我调用下面的函数时,它将XX00.data存储在ll中
fgets(ll,10,keysFile);
为什么会发生这种奇怪的事情?请检查下面的代码。但实际上,整个代码可能会让您感到困惑,这就是为什么我以前没有保留它,但为了消除一些困惑,我正在用代码编辑我的问题
。。。。正在请求时放置完整的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int N=192;
int L=8;
int S[192];
int i,j;
int K[8];
int X,Y;
int KeyCounter[192];
int FMSAttack(int,int,int,int,int, int);
int FMS(char[], int);
int Max(int[]);
/*void KSA(int *, int);
KSA(int *S,int N)
{
it i,j;
for(i=0;i<B+3;i++)
{
}
}*/
int main()
{
int i,j,B=0,nextKey;
for(B=0; B<5;B++)//(L-3);B++)
{
/*int SCurr[N];
for (int i = 0; i < N; i++)
{
SCurr[i]=S[i];
}*/
for(i = 0;i<= 4; i++)
{
for (j = 0; j <= 9; j++)
{
if(i==0 && j==9)
continue;
char fileName[10]="AXX";
char append[10];
sprintf(append, "%d", i);
strcat(fileName,append);
sprintf(append, "%d", j);
strcat(fileName,append);
strcat(fileName,".data");
//printf("%s\n", fileName);
nextKey=FMS(fileName,B);
}
}
K[B+3]=nextKey;
//KSA(SCurr[],N);
}
}
int FMS(char fileName[], int B)
{
int f;
FILE *outfile;
FILE *infile;
FILE *keysFile;
char outFileName[]="Out";
char line[20];;
char firstLine[20];
char *firstLineArgs;
char ll[10];
int tuples;
int count=0;
int NextKey;
int max;
strcat(outFileName,fileName);
infile=fopen(fileName,"r");
//printf("%fopen\n",fopen("keysFile.data","r") );
if(access( "keysFile.data",F_OK ) != -1 )
{
printf("a\n");
keysFile=fopen("keysFile.data","a");
}
else
{
printf("w\n");
keysFile=fopen("keysFile.data","w");
}
fprintf(keysFile, "%s ",fileName);
fgets(firstLine,20,infile);
//printf("firstLine=%s\n",firstLine);
L=atoi(strtok(firstLine," "));
tuples=atoi(strtok(NULL," "));
//printf("%d",L);
//printf("%d",tuples);
fgets(firstLine,20,infile);// To skip unnecessary line
for(f=0;f<N;f++)
KeyCounter[f]=0;
for (f=0;f<tuples;f++)
{
int k0,k1,k2,R;
char *lineArgs;
fgets(line,20,infile);
//printf("%s\n",line);
//printf("%s\n",strtok(line," "));
k0=atoi(strtok(line," "));
k1=atoi(strtok(NULL," "));
k2=atoi(strtok(NULL," "));
R=atoi(strtok(NULL," "));
if(FMSAttack(k0,k1,k2,R,L,B)==1)
{
count++;
NextKey=R-j-S[B+3];
if(NextKey<0)
NextKey=NextKey+N;
else if(NextKey>(N-1))
NextKey=NextKey-N;
KeyCounter[NextKey]++;
//fprintf(outfile, "%d %d %d %d K[B+3]=%d\n", k0,k1,k2,R,NextKey);
// printf("%d NextKey=%d\n",count,NextKey);
}
}
max=Max(KeyCounter);
do
{
//printf("ll=%s\n",ll );
fgets(ll,11,keysFile);
printf("ll=%s fileName=%s\n",ll,fileName );
if(strncmp(ll,fileName,8)>0)
break;
}
while(fgets != '\0');
printf("PRATIK\n");
fprintf(keysFile, " %d\n",max);
printf("PRATIK\n");
fclose(infile);
fclose(outfile);
fclose(keysFile);
printf("PRATIK\n");
return max;
}
int FMSAttack(int k0,int k1,int k2,int R,int L, int B)
{
//KSA
// Assigning Initial Values
K[0]=k0;
K[1]=k1;
K[2]=k2;
//Initialization
for (i = 0; i < N; i++)
{
S[i]=i;
}
j=0;
//Scrambling
for (i=0; i<B+3; i++)
{
int temp;
j=(j+S[i]+K[i % L]) % N;
//swap s[i] & s[j]
temp=S[i];
S[i]=S[j];
S[j]=temp;
}
X=S[1];
Y=S[X];
if(X+Y==B+3)
return 1;
else
return 0;
/*
//PRGA
//Initilization
i=0;
j=0;
//Generation Loop
for(i=0,j=0;i<3;i++)
{
i=i+1;
j=j+S[i];
X=S[i];
Y=S[X];
if(X+Y==B+3)
return 1;
}
return 0;*/
}
int Max(int KeyCounter[])
{
int i,max=0,totalCount=0;
for(i=1;i<N;i++)
{
totalCount=totalCount+KeyCounter[i];
if(KeyCounter[i]>KeyCounter[max])
max=i;
}
printf("max=%d total=%d per=%d\n",KeyCounter[max],totalCount,KeyCounter[max]*100/totalCount );
//if(KeyCounter[max]*100/totalCount>20)
return max;
//else
// return -1;
}
#包括
#包括
#包括
#包括
int N=192;
int L=8;
int-S[192];
int i,j;
int K[8];
int X,Y;
int键计数器[192];
攻击(int,int,int,int,int,int,int,int,int);
内部FMS(字符[],内部);
int Max(int[]);
/*无效KSA(整数*,整数);
KSA(整数*S,整数N)
{
它i,j;
对于(i=0;i至少fgets()
使用是非常错误的
char ll[10];
...
do {
// .....v...... Wrong size
fgets(ll, 11, keysFile);
printf("ll=%s fileName=%s\n", ll, fileName);
// 8 and > here look questionable too.
if (strncmp(ll, fileName, 8) > 0)
break;
} while (fgets != '\0');
// ....^...... this is not a call to fgets
建议如下
char ll[12];
...
while (fgets(ll, sizeof ll, keysFile) != NULL) {
printf("ll='%s' fileName='%s'\n", ll, fileName);
if (strncmp(ll, fileName, 8) > 0)
break;
}
我发现了错误。追加(a)不支持读取(r)模式。因此必须使用读取+追加(r+)进行更改模式。非常感谢您抽出宝贵的时间。在调用fgets
之前,您是否尝试从文件中读取任何内容?您是否分配了ll
并且至少有10个字节的空间?您正在读取的字符串对于缓冲区来说太长,fgets读取n-1个字符并在末尾添加空终止符。请尝试fgets(ll,11,keysFile);
。@jpw:不太可能。那么什么会导致丢弃第一个字节呢?缓冲区太短可能会导致UB,但我认为不会出现这种情况。(至少对于UB的合理行为而言。)@用户253900:正在打印,但值错误。要打开文件进行读写,打开文件时应使用a+//code>/w+//code>而不是a
/w
模式。我们真的需要200多行来重现此问题吗?一些红旗:keysFile=fopen(“keysFile.data”,“a”)
或keysFile=fopen(“keysFile.data”,“w”);
和char ll[10];
和gets(ll,11,keysFile);
。为什么要使用ll
这样的变量名?不起作用:(我认为没有人能够回答这个问题,我应该关闭它。如果你不检查fgets()返回的值)
function,您仍然存在严重问题。