将FILE中的字符串与其他字符串

时间:2017-11-21 08:39:04

标签: c string file struct

我试图用strcmp()比较2个字符串。其中一个是通过键盘实现的,但另一个是从文件中扫描的,所以我使用fgets(vec[i].nombre,80,fentrada);,其中“vec”是来自typedef结构的向量,其中一个char变量名为“nombre”。 问题是虽然我输入了从文件中获取的完全相同的字符串,但它不返回0.我将最大字符限制为文件中字符串的长度,并且它使它工作,所以必须有一些东西处理空白。但重点是让它适用于字符串的长度。

这是结构:

typedef struct f{
    int dia;
    int mes;
    int anno;
    };
typedef struct pelicula{
    char nombre[80];
    float nota;
    f fecha;
}peliculas;
peliculas vec[dim];

这是扫描文件中的内容的句子。

FILE *fentrada=fopen("peliculas.dat","rt");
while(!feof(fentrada)){
    fgets(vec[i].nombre,80,fentrada);
    fscanf(fentrada,"%i",&vec[i].fecha.dia);
    fscanf(fentrada,"%i",&vec[i].fecha.mes);
    fscanf(fentrada,"%i",&vec[i].fecha.anno);
    fscanf(fentrada,"%f\n",&vec[i].nota);
    i++;
    printf("\n");
}

这是我比较字符串的地方:

int i=0,j=0;
char *nombre,cos[46],c[66];
strcpy(c,vec[i].nombre);
gets(cos);
printf("%s\n",c);
printf("%i",strcmp(cos,c));

这就是文件的样子:

Casa Blanca
4 11 2013
6
Mi villano favorito
5 11 2013
7
Crepusculo
6 11 2013
8

P.D,我尝试使用scanf(%s)代替fgets,但它只扫描“Casa”,然后是“Blanca”,所以我得到6个元素而不是3个......

1 个答案:

答案 0 :(得分:0)

可能出现的问题:

您使用fgets从文件中读取的行包含换行符,但gets不包含。也不建议使用feof(file)

解决方案:

使用fscanf代替fgets。它返回一个整数值,表示与文件输入匹配的值。

  

fscanf返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

代码:

只需更改扫描文件行的代码

int ret;
while(ret = fscanf(fentrada,"%[0-9a-zA-Z ] %d %d %d %d ", vec[i].nombre, &vec[i].fecha.dia, &vec[i].fecha.mes, &vec[i].fecha.anno, &vec[i].nota))
{
    if(ret == EOF)
    {
        break;
    }else
    {
        // printf("\n %d",ret);
        // ^ prints how many values are successfully matched
    }
}

注意:我已检查此代码以供您输入。它工作正常并返回0作为strcmp

的输出

参考:fscanf - TutorialsPoint