繁体   English   中英

C 中字符串数组的 fread 问题

[英]Problem with fread on a array of strings in C

将字符串传递给文件时出现问题。 我几乎可以肯定问题出在我读取变量的方式上,所以我留下了我认为错误的代码。 如果您不认为问题可能来自那里,我会重新评估情况并发送我认为必要的内容。

我不明白我的问题,因为系统实际上是在保存一些东西,但是例如当我输入 5 个团队时,系统只在文件中注册了 2 或 3 个团队。 有谁知道这是关于什么的?

这是代码:

我的结构:


typedef struct String {

    char string[50];
    
}string; 

我的变量:


int nEquipas = 0;
    
string equipa[50];

在这里我定义文件位置


#define FICHEIRO_EQUIPAS "Equipas.dat"
#define FICHEIRO_NEQUIPAS "nEquipas.dat"

在这里,当我询问 n 团队的名称时:


void newTeam(string *equipa, int *nEquipas)
{
    
    puts("INSIRA O NOME DA EQUIPA: ");
    fflush(stdin);
    gets(equipa[*nEquipas].string); 
    system("cls");
    
    saveTeams(equipa, nEquipas);
    saveNumTeams(nEquipas);
}

在这里,当我编写变量 nEquipas 时:

void saveNumTeams(int *nEquipa)
{
    
    // variaveis
    FILE *ficheiro;
    int i;
    
    
    ficheiro = fopen(FICHEIRO_NEQUIPAS, "wb");
    
    // se não foi possivel abrir o ficheiro (por exemplo: problema de permissões), mostra erro e sai
    if (ficheiro == NULL)
    {
        printf("!!!não foi possivel abrir o ficheiro %s!!!\n", FICHEIRO_NEQUIPAS);
        return;
    }
        
        
    //Escrever no ficheiro
    fwrite(nEquipa, sizeof(int), 1, ficheiro);

    
    // fechar o ficheiro
    fclose(ficheiro);
    
}

这里我保存了数组字符串equipas


void saveTeams(string *equipa, int *nEquipa)
{
    
    // variaveis
    FILE *ficheiro;
    int i;
    
    
    ficheiro = fopen(FICHEIRO_EQUIPAS, "a+b");
    
    // se não foi possivel abrir o ficheiro (por exemplo: problema de permissões), mostra erro e sai
    if (ficheiro == NULL)
    {
        printf("!!!não foi possivel abrir o ficheiro %s!!!\n", FICHEIRO_EQUIPAS);
        return;
    }
    
    
    //Procurar o fim
    fseek(ficheiro, 0, SEEK_END);
        
        
    //Escrever no ficheiro
    fwrite(equipa, sizeof(string), *nEquipa, ficheiro);
        
    // fechar o ficheiro
    fclose(ficheiro);
    
}

在这里,我阅读了两个变量:


void gerirFicheiros(string *equipa, int *nEquipas, membro medico[][50], int *nMedicos)
{

    // variaveis
    FILE *ficheiro;
    int i;

    // tentar abrir ficheiro (r = leitura b = binario)
    ficheiro = fopen(FICHEIRO_NEQUIPAS, "rb");

    // se não foi possivel abrir o ficheiro (por exemplo: por não existir), mostra erro e sai
    if (ficheiro == NULL)
    {
        printf("!!!não foi possivel abrir o ficheiro %s!!!\n", FICHEIRO_NEQUIPAS);
        return;
    }

    fread(nEquipas, sizeof(int), 1, ficheiro);

    // fechar o ficheiro
    fclose(ficheiro);

    ficheiro = fopen(FICHEIRO_EQUIPAS, "rb");
    
    // se não foi possivel abrir o ficheiro (por exemplo: por não existir), mostra erro e sai
    if (ficheiro == NULL)
    {
        printf("!!!não foi possivel abrir o ficheiro %s!!!\n", FICHEIRO_EQUIPAS);
        return;
    }
    
    // posicionar no inicio do ficheiro
    rewind(ficheiro);  

    
     fread(equipa, sizeof(string), *nEquipas, ficheiro);
    

    // fechar o ficheiro
    fclose(ficheiro);

}

我读对了吗?

非常感谢大家!

在这个循环中:

for (i = 0; i <= *nEquipas; i++) {
    fread(&equipa[i], sizeof(string), (i + 1), ficheiro);
}

有2个问题。 首先,索引 arrays go 从0array_size - 1 其次, fread的第三个参数是要读取多少个项目,所以在这种情况下它应该是1

for (i = 0; i < *nEquipas; i++) {
    fread(&equipa[i], sizeof(string), 1, ficheiro);
}

由于您知道项目的数量,因此您可能会完全失去循环:

fread(equipa, sizeof(string), *nEquipas, ficheiro);

请注意, fread返回读取的项目数。 您应该将其与预期检查错误的内容进行比较。

另一个问题是您打开文件进行追加,然后写入整个列表。 这只是不断添加具有 1 个字符串、2 个字符串、3 个字符串等的列表。

您可以不打开以追加和写入整个列表:

ficheiro = fopen(FICHEIRO_EQUIPAS, "wb");
fwrite(equipa, sizeof(string), *nEquipa, ficheiro);

或者,打开以追加并只写列表中的最后一项:

ficheiro = fopen(FICHEIRO_EQUIPAS, "a+b");
fwrite(&equipa[*nEquipa-1], sizeof(string), 1, ficheiro);

我已经解决了我的问题。 这是更正:

我改变我的fwrite:

前:


    fwrite(equipa, sizeof(string), *nEquipa, ficheiro);
        

后:


fwrite(&equipa[*nEquipa], sizeof(string), 1, ficheiro);

我也改变了对equipa的恐惧:

前:


     fread(equipa, sizeof(string), *nEquipas, ficheiro);


fread(&equipa[i], sizeof(string), 1, ficheiro);

非常感谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM