【问题标题】:How to copy numbers from an array into a binary file one-at-a-time?如何将数组中的数字一次复制到二进制文件中?
【发布时间】:2015-10-08 08:03:07
【问题描述】:

我正在尝试找出一种将数组中的数字复制到二进制文件一次一个数字的方法。我可以使用 fwrite 将整个数组复制到二进制文件中,但我想知道是否有一种方法可以这样做 one-number-at-a-time

CopyArrayToBinary 函数中,如何修改 fwrite 以便能够一次将一个数字打印到二进制文件中。

我的程序能够顺利编译,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void CopyArrayToBinary(int a[]);
void AppendNumbers(int a[]);
void DisplayBinFile(char fname[]);

int main()
{
     int a[6]={30,60,10,90,40,70};

     CopyArrayToBinary(a);
     AppendNumbers(a);
     DisplayBinFile("binary.txt");

     printf("\n\n");
     system("PAUSE");
     return 0;
}

 void CopyArrayToBinary(int a[])
 {
     FILE * fbin;
     fbin = fopen("binary.txt","w");
     int i;

     fwrite((char *)a, sizeof(int), 6 , fbin);

     free(a);
     fclose(fbin);

     return 0;
 }

  void AppendNumbers(int a[])
 {
  int c[4]={15,45,35,74};
  FILE * fpointer;
  fpointer = fopen("binary.txt", "a");

  fwrite((char *)c,sizeof(int),4,fpointer);

  free(a);
  fclose(fpointer);

 return 0;
}

void DisplayBinFile(char fname[])
{
  FILE * fpointer;
  int i ;
  int b[10];

    fpointer = fopen(fname, "r");
    fread((char *)b, sizeof(int),10,fpointer);

  //DISPLAY ARRAY B
  for(i=0; i<10; i++)
 {
     printf("%d ",b[i]);
 }

  fclose(fpointer);

 return 0;
}

【问题讨论】:

  • 请缩进您的代码。
  • fread((char *)b, sizeof(int),10,fpointer);是错误的。您尝试将 10 个整数(通常为 40 个字节)读入 10 个字节的缓冲区。
  • CopyArrayToBinary 函数有什么问题?除了硬编码要写入的长度并且不进行错误检查之外,该功能应该按预期工作。您将 6 个整数写入文件。如果你想写一个 int 而不是 6 个 int,写 fwrite((char *)a, sizeof(int), 1 , fbin);.
  • free(a); 你正在释放一个没有由 malloc() 获得的对象。
  • free(a) 正在尝试释放堆栈变量 [在 main 中定义]——这不是一件好事,所以删除它。即使它是 malloc 的,你也不想在 copy func 中释放它,因为当你调用 append 时它会是垃圾。此外,fwrite 需要一个 const void *,因此不需要强制转换为 char *。至于一次一个,做: for (i = 0; i

标签: c arrays file printf fwrite


【解决方案1】:

fwrite原型是:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

其中nmemb 是您要写入的元素数。

请注意,如果您想每次添加一个字符,则必须使用"w+"(或更好的"wb+")选项打开文件,以便在文件末尾附加字符。


由于CopyArrayToBinary 函数中的 free(a) 指令,您的代码无法正常工作。您不能释放指向堆栈分配数组的指针。使用free 释放堆mallocated 变量。

【讨论】:

    猜你喜欢
    • 2018-04-28
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    相关资源
    最近更新 更多