我正在编写一个程序来读取文件并生成每个字节的整数数组,首先我使用.txt文件进行验证,然后为每个字母及其对应的字节生成ASCII(例如ASCII对于B是66,并且66的二进制是01000010,我的程序在.exe窗口中打印这两个),但我需要使用数组的整数(rest [x])制作相同的文件,我可以制作一个新文件.txt,但它只有垃圾,或者我认为是,file.txt是新文件.txt的名称,它只有垃圾,我想恢复UAM.txt中的文本,并写入来自数组rest [x];
的file.txt#include<stdio.h>
int main()
{
int b1, b2, b3, b4, b5, b6, b7, b8;
int x, i;
char a, b;
FILE *f1, *bin, *fp;
b1 = 0x01; // = 0000 0001
b2 = 0x02; // = 0000 0010
b3 = 0x04; // = 0000 0100
b4 = 0x08; // = 0000 1000
b5 = 0x10; // = 0001 0000
b6 = 0x20; // = 0010 0000
b7 = 0x40; // = 0100 0000
b8 = 0x80; // = 1000 0000
int mask[8] = { b8, b7, b6, b5, b4, b3, b2, b1 };
int rest[8];
f1 = fopen("UAM.txt", "rb");
fp = fopen("file.txt", "w+");
while (!feof(f1))
{
a = getc(f1);
printf("%d\n", a);
for (i = 0; i <= 7; i++)
{
rest[i] = a & mask[i];
}
for (i = 0; i <= 7; i++)
{
rest[i] = rest[i] / mask[i];
}
for (x = 0; x <= 7; x++)
{
printf("%i", rest[x]);
fputc(rest[x], fp);
}
fclose(fp);
printf("\n");
}
return 0;
}
输入文件可以是任何文本,例如我在UAM.txt中保存单词B,在.exe窗口中我获得66和01000010,这是B的十进制和二进制的ASCII代码,接下来是二进制数是字的字节,位于整数数组中(rest [x])。我需要将这个二进制文件再次转换为字母B,并将此字母或任何文本保存在我命名为file.txt的新文件中,在此文件中必须再次为字母B或UAM中的任何文本.txt对不起我糟糕的英语!
任何帮助将不胜感激!
答案 0 :(得分:0)
问题是因为使用了fputc。它总是打印一个字符,因此rest [x]的值被转换为一个字符,然后写入该文件。这就是为什么你看到文件中的所有垃圾。
替换如下:
fprintf(fp,"%i", rest[x]); // %i here would print the expected value
//fputc(rest[x], fp);
此外,关闭应该是循环。
还有一点需要注意的是,当你逐字逐字地阅读文件结尾时,它也会转换为结尾的“\ n”和“\ r”字符。
以下是工作计划:
#include <stdio.h>
int main() {
int b1, b2, b3, b4, b5, b6, b7, b8;
int x, i;
char a;
FILE *f1, *fp;
b1 = 0x01; // = 0000 0001
b2 = 0x02; // = 0000 0010
b3 = 0x04; // = 0000 0100
b4 = 0x08; // = 0000 1000
b5 = 0x10; // = 0001 0000
b6 = 0x20; // = 0010 0000
b7 = 0x40; // = 0100 0000
b8 = 0x80; // = 1000 0000
int mask[8] = { b8, b7, b6, b5, b4, b3, b2, b1 };
int rest[8];
f1 = fopen("UAM.txt", "rb");
fp = fopen("file.txt", "w+");
while (!feof(f1))
{
a = getc(f1);
printf("%d\n", a);
for (i = 0; i <= 7; i++)
{
rest[i] = a & mask[i];
}
for (i = 0; i <= 7; i++)
{
rest[i] = rest[i] / mask[i];
}
for (x = 0; x <= 7; x++)
{
printf("%i", rest[x]);
fprintf(fp,"%i", rest[x]);
//fputc(rest[x], fp);
}
fprintf(fp,"\n");
printf("\n");
}
fclose(f1);
fclose(fp);
return 0;
}
答案 1 :(得分:0)
您应该使用掩码数组从数组开始重建整数。
#include<stdio.h>
int main(void)
{
int b1, b2, b3, b4, b5, b6, b7, b8;
int x, i;
char a, b;
FILE *f1, *bin, *fp;
b1 = 0x01; // = 0000 0001
b2 = 0x02; // = 0000 0010
b3 = 0x04; // = 0000 0100
b4 = 0x08; // = 0000 1000
b5 = 0x10; // = 0001 0000
b6 = 0x20; // = 0010 0000
b7 = 0x40; // = 0100 0000
b8 = 0x80; // = 1000 0000
int mask[8] = { b8, b7, b6, b5, b4, b3, b2, b1 };
int rest[8];
f1 = fopen("UAM.txt", "rb");
fp = fopen("file.txt", "w+");
while ((a = fgetc(f1)) != EOF)
{
printf("%d\n", a);
for (i = 0; i <= 7; i++)
{
rest[i] = a & mask[i];
}
for (i = 0; i <= 7; i++)
{
rest[i] = rest[i] / mask[i];
}
a=0;
for (x = 0; x <= 7; x++)
{
printf("%i", rest[x]);
a += rest[x] * mask[x];
}
printf("\n%d\n", a);
fputc(rest[x], fp);
printf("\n");
}
fclose(f1);
fclose(fp);
return 0;
}
更好的方法可能是
#include<stdio.h>
int main(void)
{
int x, i;
char a;
FILE *f1, *fp;
int rest[8];
f1 = fopen("UAM.txt", "rb");
if ( f1 != NULL)
{
fp = fopen("file.txt", "w+");
if ( fp != NULL)
{
while ((a = fgetc(f1)) != EOF)
{
printf("%d\n", a);
for (i = 0; i < 8; i++)
{
rest[i] = a & 0x01;
a>>=1;
}
a=0;
for (x = 7; x >= 0; x--)
{
printf("%i", rest[x]);
a += ((0x01u << x) * rest[x]);
}
fputc(rest[x], fp);
printf("\n");
}
fclose(fp);
}
fclose(f1);
}
return 0;
}
答案 2 :(得分:0)
问题#1:
你在循环中调用fclose
,因为你还在尝试写入文件。将fclose
移到while
循环之外。
问题#2:
while (!feof(f1))
不是检查是否已到达文件结尾的正确方法。相反,您应该检查getc
的返回值:赞:
while ((a = getc(f1)) != EOF)
问题#3:
您不能将二进制值逐个写入输出文件以重现原始字符。 fputc
写了一整个字符 - 而不是一点点。因此,您需要从二进制值重建原始字符,并且只需调用fputc
一次。
替代二元计算
您的代码计算二进制表示(位值)是否正确。但是,您似乎使用了太复杂的方法。请考虑使用>>
(也就是右移)。像:
// Create the binary values
for (i = 7; i >= 0; i--)
{
rest[i] = a & 1;
a = a >> 1;
}
所以把它们放在一起,代码可以是:
int main(void)
{
int i;
char a;
int t;
FILE *f1, *fp;
int rest[8];
f1 = fopen("UAM.txt", "rb"); // TODO: check that fopen went well
fp = fopen("file.txt", "w+"); // TODO: check that fopen went well
while ((a = getc(f1)) != EOF)
{
printf("Char representation %c\n", a);
printf("Decimal representation %d\n", a);
// Create the binary values
for (i = 7; i >= 0; i--)
{
rest[i] = a & 1;
a = a >> 1;
}
printf("Binary representation: ");
for (i = 0; i <= 7; i++)
{
printf("%d", rest[i]);
}
printf("\n");
// Reconstruct original value
t = 0;
for (i = 0; i <= 7; i++)
{
t = t << 1;
t = t | rest[i];
}
// Write reconstructed value to file
fputc(t, fp);
}
fclose(fp);
fclose(f1);
return 0;
}