使用C [duplicate]将整数数组写入文件

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我想用C写一个整数数组到一个文件中。但是,我在文件中得到了一些乱码。

代码是关于将十进制数转换为二进制数然后将其存储到文件中的函数。

int * decToBinary(int n) //function to transform the decimal numbers to binary
{
    static int binaryNum[16]; // array to store binary number      
    int i = 0; // counter for binary array
    while (n > 0) {
        binaryNum[i] = n % 2; // storing remainder in binary array
        n = n / 2;
        i++;
    }
    return binaryNum;
}

int main()
{  
   FILE *infile;
   int i;
   int *p;
   int decimal= 2000;
   int written = 0;

   infile = fopen("myfile.txt","w");
   p = decToBinary(decimal);
   written = fwrite(p,sizeof(int),sizeof(p),infile) ;

   if (written == 0) {
       printf("Error during writing to file !");
   }
   fclose(infile);
   return 0;

}

这是我在我的文件中得到的:

This is what I get in my file:


这是我将文本作为测试编写时得到的,它对文本没有任何问题,但它与数组有关。

char str[] = "test text --------- \n";
infile = fopen("myfile.txt","wb");
p=decToBinary(decimal);
fwrite(str , 1 , sizeof(str) , infile);
written = fwrite(p,sizeof(int),sizeof(p),infile) ;

enter image description here


这就是我做这个改变时得到的:

written = fwrite(&p,sizeof(int),sizeof(p),infile) ;

enter image description here

c arrays file integer storage
2个回答
1
投票

首先,请注意“二元”有两种解释:

int n = 1012;
fwrite(&n, sizeof(n), 1, file);

这就是按原样写出数据;因为它以位的形式表示,输出被认为是“二进制”(二进制文件)。

但是,你的问题和你提供的代码,相当暗示你实际上想要一个包含二进制文本格式的数字的文件,i。即7由字符串"111"表示。

首先,要注意0和1在大多数(如果不是全部)编码中不代表字符'0''1'。假设ASCII或兼容,'0'由值48表示,'1'由值49表示。由于C标准要求数字[0..9]为连续字符(这不适用于任何其他字符!),您可以安全地执行:

binaryNum[i] = '0' + n % 2;

请注意,如果您需要字符串,您选择了错误的数据类型,则需要一个字符数组:

static char binaryNum[X];

X ???我们需要谈谈所需的尺寸!

如果我们创建字符串,我们需要null终止它们。所以我们需要放置终止0字符(真正值0,而不是字符'0' 48),所以我们需要至少一个字符。

目前,由于n > 0的比较,你认为负值等于0.你真的打算这样吗?如果是这样,您可能会将unsigned int视为数据类型,否则,请留下一些注释,然后我将介绍稍后处理负值。

限制为正值,16 + 1作为大小是好的,假设int在您的系统上有32位!但是,C标准允许int更小或更大。如果你想要便携,可以使用CHAR_BIT * sizeof(int) / 2CHAR_BIT<limits.h>中定义;如果切换到unsigned int,则除以2)。

有一个特殊情况没有涉及:整数值0根本不会进入循环,因此你最终得到一个空字符串,所以分别抓住这个案例:

if(n == 0)
{
    binaryNum[i++] = '0';
}
else
{
    while (n > 0) { /.../ }
}
// now the important part:
// terminate the string!
binaryNum[i] = 0;

现在你可以简单地做(假设你将p改为char*):

written = fprintf(file, "%s\n", p);
//                         ^^ only if you want to have each number on separate line
//                          you can replace with space or drop it entirely, if desired

请注意,该算法首先打印出最低有效位!您可能希望将其反转,然后您要么必须还原字符串或(我更喜欢)从将终止0写入结尾然后逐个向前填充数字 - 返回指针写入最后一个数字(最重要的一个)而不是总是缓冲区的开始。

关于您原始版本的一句话:

written = fwrite(p, sizeof(int), sizeof(p), infile);

sizeof(p)给你一个指针的大小;这一个是系统相关的,但在同一个系统上总是相同的,很可能是8个(如果是现代的64位硬件),可能是4个(在典型的32位CPU上),不太常见的系统上的其他值是可能的同样。你需要返回单独打印的字符数(不,sizeof(binaryNum)不合适,因为它总是返回17,假设32位int并且上面显示的所有更改都适用)。


0
投票

你可能想要这个:

...
int main()
{
  int decimal = 2000;    
  int *p = decToBinary(decimal);

  for (int i = 0; i< 16; i++)
  {
    printf("%d", p[i]);
  }

  return 0;
}

输出转到终端而不是文件。

要写入文件,请在代码中使用fopen,并使用fprintf而不是printf

关于decToBinary仍然有改进的余地,特别是你可以使用char0算子直接将数字转换为仅包含字符1<<&数组。

© www.soinside.com 2019 - 2024. All rights reserved.