[英]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 从0
到array_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.