我不習慣編程(因為我是新手)所以我想在這個專案上獲得一些幫助......我正在嘗試使用二進制檔案、結構和指標制作一個制造商/閱讀器程式,但我的每次這個程式和他的行程都會崩潰
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Recipe{
char name[30];
char difficulty[30];
double calories;
};
void generate_file(FILE *in){
fopen("recipe.bin", "wb");
if(in == NULL){
fprintf(stderr, "\nErro, o arquivo n?o pode ser aberto\n");
exit(1);
}
struct Recipe *recipe = malloc(sizeof(struct Recipe));
printf("Digite o nome da receita: ");
gets(recipe->name);
printf("Digite o nivel de dificuldade da receita: ");
gets(recipe->difficulty);
printf("Digite o número de calorias: ");
scanf("%d", &recipe->calories);
fwrite(&recipe, sizeof(struct Recipe), 1, in);
if(fwrite != 0){
printf("Arquivo salvo com sucesso!");
}else{
printf("Falha no salvamento de dados");
exit(1);
}
fclose(in);
exit(0);
}
int main(int argc, char* argv[]){
FILE *in;
generate_file(in);
}
uj5u.com熱心網友回復:
程式崩潰是因為您將未初始化或錯誤的指標傳遞給某些函式。
從上到下:
更改generate_file的宣告,使其接受檔案名并回傳一個整數,如下所示:
int generate_file(const char *filename)
將fopen的結果分配給in,如下所示:
FILE *in = fopen(filename, "wb");
將退出替換為回傳:
return 1;
創建后用零初始化結構,以便于排除故障:
memset(recipe, 0, sizeof(struct Recipe));
用 %lf 掃描卡路里時替換 %d:
scanf("%lf", &recipe->calories);
呼叫 fwrite 時不要取消參考配方(將&recipe替換為recipe) - 它已經是一個指標。將 fwrite 函式的結果賦值給一個變數,然后在檢查寫入了多少項時測驗變數而不是函式指標:
size_t written = fwrite(recipe, sizeof(struct Recipe), 1, in);
if (written != 0) {
同樣,將exit替換為return并使用與之前不同的值,以便稍后區分問題的原因:
return 2;
釋放為配方分配的記憶體:
free(recipe);
在main()中,將引數更改為檔案名并使用被呼叫函式的結果:
int result = generate_file("recipe.bin");
return result;
這是完整的代碼:
int generate_file(const char *filename) {
FILE* in = fopen(filename, "wb");
if(in == NULL) {
fprintf(stderr, "\nErro, o arquivo n?o pode ser aberto\n");
return 1;
}
struct Recipe *recipe = malloc(sizeof(struct Recipe));
memset(recipe, 0, sizeof(struct Recipe));
printf("Digite o nome da receita: ");
gets(recipe->name);
printf("Digite o nivel de dificuldade da receita: ");
gets(recipe->difficulty);
printf("Digite o número de calorias: ");
scanf("%lf", &recipe->calories);
size_t written = fwrite(recipe, sizeof(struct Recipe), 1, in);
if(written != 0){
printf("Arquivo salvo com sucesso!");
}else{
printf("Falha no salvamento de dados");
return 2;
}
free(recipe);
fclose(in);
return 0;
}
int main(int argc, char* argv[]) {
int result = generate_file("recipe.bin");
return result;
}
uj5u.com熱心網友回復:
我猜你想in用作你的檔案?您沒有分配 to 的回傳fopen值in。in沒有指向任何東西,所以使用諸如fwriteon 之類的 I/O 函式會導致一些錯誤。
in = fopen("recipe.bin", "wb");
此外,fwrite需要一個指標,而不是指向指標的指標,因為recipe已經是指標,所以不需要&.fwrite(const void *ptr..)
旁注:你不應該使用gets,它不是一個安全的函式,因為它可能會導致溢位。改為使用fgets。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506458.html
