使用C将整数数组写入文件

使用C将整数数组写入文件,c,arrays,file,integer,storage,C,Arrays,File,Integer,Storage,我想用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

我想用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;

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


这是我在编写文本作为测试时得到的结果,它与文本没有任何问题,但与数组有问题

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) ;


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

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

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

int n = 1012;
fwrite(&n, sizeof(n), 1, file);
这会按原样写出数据;由于它是以位的形式表示的,所以输出被认为是“二进制”(二进制文件)

但是,您的问题和您提供的代码暗示您实际上想要一个包含二进制文本格式的数字的文件,即。E7由字符串
“111”
表示

首先,请注意,在大多数(如果不是全部)编码中,0和1并不代表字符
'0'
'1'
。假设或兼容,
'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。你真的打算这样做吗?如果是这样,您可能会考虑<代码>未签名的int < /C>作为数据类型,否则,留下一些注释,然后我将稍后处理负面值。 在限制为正值的情况下,

16+1
as大小很好,假设
int
在您的系统上有32位!然而,C标准也允许int更小或更大。如果您想便于携带,请使用
CHAR\u-BIT*sizeof(int)/2
CHAR\u-BIT
中定义;如果切换到无符号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*
):

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

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

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

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

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

int n = 1012;
fwrite(&n, sizeof(n), 1, file);
这会按原样写出数据;由于它是以位的形式表示的,所以输出被认为是“二进制”(二进制文件)

但是,您的问题和您提供的代码暗示您实际上想要一个包含二进制文本格式的数字的文件,即。E7由字符串
“111”
表示

首先,请注意,在大多数(如果不是全部)编码中,0和1并不代表字符
'0'
'1'
。假设或兼容,
'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。你真的打算这样做吗?如果是这样,您可能会考虑<代码>未签名的int < /C>作为数据类型,否则,留下一些注释,然后我将稍后处理负面值。 在限制为正值的情况下,

16+1
as大小很好,假设
int
在您的系统上有32位!然而,C标准也允许int更小或更大。如果您想便于携带,请使用
CHAR\u-BIT*sizeof(int)/2
CHAR\u-BIT
中定义;如果切换到无符号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*
):

请注意,按原样,算法首先打印出最低有效位!您可能希望将其反转,然后您必须还原字符串,或者(我更喜欢)从将终止的0写入末尾开始,然后向前面逐个填充数字-返回指向写入instea的最后一个数字(最重要的一个)的指针