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,您仍然存在严重问题。