txt文件中的第一个字符不能用C打印

时间:2018-05-08 17:41:43

标签: c pointers file-io

我是C的初学者。 我在c。做了一个简单的游戏。

我有一个.txt文件,用于存储玩家的分数,例如

gse
12
CKY
8

然后我在C中有这个功能,该功能根据上面的.txt文件输出得分。

int n = 0;
int c;
int p=0;
char name[NAME_LENGTH] = { 0 };
char score[NAME_LENGTH] = { 0 };
FILE *fp = fopen("scoreBoard.txt", "r");

if (fp == NULL) {
    printf("no score available\n");
    fflush(stdin);
    getchar();
    return;
}

system("cls");//clears the screen

if (fp){
    while((c=getc(fp)!=EOF)){

        if(n%2==0){
            fgets(name,NAME_LENGTH,fp);
            printf("%d ",n/2+1); //index
            printf("%s",name);
            n++;
        }
        if(n%2==1){
            fgets(score,NAME_LENGTH,fp);
            printf("%s",score);
            n++;
        }
    }

    fclose(fp);
}

printf("=======SCORE=======\n");

printf("Enter AnyKeys");
Sleep(100);
getchar();
getchar();
//fflush(stdin);
}

输出如下

1 se
12
2 KY
8

我尝试过很多东西,但我无法理解。 我想有些事情正在吞噬代码。问题是(c=getc(fp)!=EOF)吗?我应该操纵指针以解决这个问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果对collectionView的调用成功,它会将文件位置指示符增加一。

#pragma pack(push, 1)
typedef struct Pix
{
    uint16_t R, G, B;
    int32_t BW;
}Pix;
#pragma pack(pop)

//Estructura del header del bmp:
#pragma pack(push, 1)
typedef struct BitMap
{
    int16_t Signature;          //Tipo de archivo (BM)          
    int32_t Reserved1;          //reservado, debe ser cero
    int32_t Reserved2;          //reservado, debe ser cero
    int32_t DataOffSet;         //Offset de los datos de los pixeles

    int32_t Size;               //Tamaño del resto del header
    int32_t Width;              //Ancho del bmp en pixeles
    int32_t Height;             //Alto del bmp en pixeles
    int16_t Planes;             //Numero de planos -> seteado en 1
    int16_t BitsPerPixel;       //Número de bits por pixel
    int32_t Compression;            //Tipo de compresion, usualmente 0
    int32_t SizeImage;          //Tamaño en bytes del bitmap    
    int32_t XPixelsPreMeter;        //Pixeles horizontales por metro
    int32_t YPixelsPreMeter;        //Pixeles verticales por metro
    int32_t ColorsUsed;         //Número de colores usados
    int32_t ColorsImportant;        //Número de colores "importantes"
    struct Pix *pixels;         //Declara estructura Pix tipo *pixels
}BitMap;
#pragma pack(pop)

要解决此问题,您可以将fgetc直接用于一个变量,而不是gse ^ file position indicator will be here after the first call fgetc in your example. fgets

name

答案 1 :(得分:0)

尝试ungetc()功能

未读取角色的功能称为ungetc,因为它会反转getc的动作。

在你的代码中尝试: -

while((c=getc(fp)!=EOF)){
     ungetc (c,fp);
     // rest of your code

}

ungetc函数将字符c推回到输入流fp。因此,来自流的下一个输入将在其他任何内容之前读取c。