我想使用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) ;
答案 0 :(得分:1)
首先,请注意,“二进制”有两种解释:
int n = 1012;
fwrite(&n, sizeof(n), 1, file);
这将按原样写出数据;以位表示时,输出被视为“二进制”(二进制文件)。
您的问题和提供的代码暗示您实际上想要一个包含二进制 text 格式数字的文件,即i。 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>
;如果您切换为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且上面显示的所有更改均适用)。
答案 1 :(得分:0)
您可能想要这样:
CREATE TABLE sales1 (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
store VARCHAR(30) NOT NULL,
newid VARCHAR(30),
amount DOUBLE,
total INT
);
CREATE TABLE sales2 (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
store VARCHAR(30) NOT NULL,
newid VARCHAR(30),
amount DOUBLE
);
INSERT INTO sales1 (store, newid, amount, total) VALUES
('123','123', 12.3, 1),('456','123', 45.6, 2),('789','adsf', 78.9, 3);
INSERT INTO sales2 (store, newid, amount) VALUES
('123','123', Null),('456','123', Null),('321','123f', Null),('789','1654', Null);
输出转到终端,而不是文件。
要写入文件,请像代码中一样使用...
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
和char
的{{1}}数组{1}}和0
运算符。