【问题标题】:Problems with fread and fwritefread 和 fwrite 的问题
【发布时间】:2013-06-30 08:13:18
【问题描述】:

我在使用fwritefread -> fread (void*, size_t, size_t, FILE*); 的程序时遇到了一些问题,当设置第二个size_t 作为任何非零的数字时,它不起作用。 这是代码;如果有人可以提供帮助,我将不胜感激。

P.S.:如果我在 readwrite 函数上替换那个 sc,它可以工作,但不像预期的那样。

#include<stdio.h>
#include<stdlib.h>
#define TAM 10
#define sc 5

typedef struct str_score{
    float scr;
    char nome[TAM];
}score;

int main(){

    FILE *arq;
    int x;
    score a[sc], i={0.00,"-empty-"};

    if ((fopen("highscore.bin", "wb+"))==NULL){
        perror("Erro na abertura do arquivo\n");
        return 1;
    }

    fwrite(&i,sizeof(score), sc, arq);

    fread(a ,sizeof(score), sc, arq);

    for (x=0;x<sc;x++){
        printf("%s %.2f", a[x].nome,a[x].scr);
    }

    return 0;

}

【问题讨论】:

  • 只是您的编译器会通过发出错误的机器代码来惩罚您的代码格式。
  • (说真的,格式化/缩进你的代码并检查fread()fwrite()的返回值。)

标签: c stream fwrite fread


【解决方案1】:
  1. 由于i不是数组,所以下面这行不正确

    fwrite(&i,sizeof(score), sc, arq);
    

    这应该是

    fwrite(&i,sizeof(score), 1, arq);
    

    只有当你有一个大小为sc 或更大的初始化数组时,你才能写出sc 的元素个数。

  2. 您不接受fopen 的返回值。将您的 fopen 行更改为

    if ((arq = fopen("highscore.bin", "wb+"))==NULL){
    
  3. fwritefread之间,放一个

    fseek(arq, 0, SEEK_SET);
    

这会将文件指针重置为您开始写入的文件的开头。

【讨论】:

  • 感谢您的评论,现在可以使用了。关于“fwrite(&i,sizeof(score), sc, arq);”,我坚持认为 i 会写 sc 次。我用它代替了这个 - for(x=0;x
  • I tought that would write i for sc times. - 它实际上从&amp;i 开始读取sc * sizeof(i) 字节 - 这就是为什么你的fread 可以正常工作的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2020-12-14
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多