gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:45:54 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

不过,您的问题和您提供的代码暗示您实际上想要一个包含二进制文本格式的数字的文件,即。 e. 7 由字符串 "111" 表示.

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

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

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

static char binaryNum[X];

X ???我们需要讨论所需的尺寸!

如果我们创建字符串,我们需要以空值终止它们。因此,我们需要为终止 0 字符提供位置(实际上值是 0,而不是字符 '0' 的 48),因此我们至少还需要一个字符。

目前,由于比较n > 0 ,您认为负值等于 0。您真的打算这样做吗?如果是这样,您可以考虑unsigned int作为数据类型,否则,请留下一些评论,然后我将在稍后介绍处理负值。

限制正值,16 + 1因为尺寸很好,假设 int您的系统上有 32 位!然而,C 标准也允许 int 更小或更大。如果你想便携,使用CHAR_BIT * sizeof(int) / 2 ( CHAR_BIT<limits.h> 中定义;如果切换到无符号整数,则除以 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 写入末尾开始,然后将数字填充为 1一个朝前 - 返回一个指向写入的最后一位(最重要的一位)的指针,而不是始终指向缓冲区的开头。

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

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

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

关于c - 使用 C 将整数数组写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com