我正在尝试制作一个非常简单的转换器/压缩器;程序应该采用包含4种不同类型ASCII字符的文件,并将其作为二进制文件写入文件。该程序还应读取二进制文件并将其转换为ASCII并在屏幕上打印出来。在我的代码下面,我无法真正获得char / cstring。我必须做些什么样的改进才能让它发挥作用?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char compresser(char c);
char converter(char c);
int main(int argc, char **argv)
{
char *c;
FILE *If = fopen("A.txt", "r");
FILE *Uf = fopen("B.txt", "rw");
if(If == NULL || Uf == NULL) {
printf("Could not open file");
}
if(argc < 4) {
printf("Too few argument, must be 3\n");
} else if(strcmp(argv[1], "p") == 0) {
while((c = fgetc(If)) != EOF) {
printf("%c", c);
}
} else if(strcmp(argv[1], "e") == 0) {
while((c = fgetc(If)) != EOF) {
fprintf(Uf, "%c\n", compresser(c));
}
} else if(strcmp(argv[1], "d") == 0) {
while((c = fgetc(Uf)) != EOF) {
printf("%c", converter(c));
}
} else {
printf("Not a valid command\n");
}
}
char compresser(char c)
{
if(c == ' ') {
return '00';
} else if(c == ':') {
return '01';
} else if(c == '@') {
return '10';
} else if(c == '\n') {
return '11';
} else {
return 'e';
}
}
char converter(char c)
{
if(c == '00') {
return ' ';
} else if(c == '01') {
return ':';
} else if(c == '10') {
return '@';
} else if(c == '11') {
return '\n';
} else {
return 'e';
}
}
答案 0 :(得分:1)
您可能想要解决许多问题。
我注意到的第一件事是您测试错误情况,打印错误消息,然后继续处理,好像一切正常。
第二个是压缩算法 不是 压缩算法。就目前而言,您似乎希望每个未压缩的角色都以压缩形式变为两个。即使你想要按照Eli的建议写一个小数值,你也不会减少存储角色所需的空间。
我的猜测是你真正想要的是binary,而不是十进制表示。那将使你用两位而不是一个完整的字节代表每个字符。
例如,给定四个字符“A”,“B”,“C”和“D”,一个可能的二进制表示将是
CHAR BITS
A <=> 00
B <=> 01
C <=> 10
D <=> 11
然后您可以选择如何将这些值组合成压缩形式,例如,四个字符序列ABAD可以表示为00010011
或11000100
。只需确保按照与组合方式相对应的方式将它们分开。
要明确00010011
等同于小数19
。
有关如何操作位的详细信息,请查看here。
答案 1 :(得分:0)
此代码不正确:
char compresser(char c)
{
if(c == ' ') {
return '00';
} else if(c == ':') {
return '01';
} else if(c == '@') {
return '10';
} else if(c == '\n') {
return '11';
} else {
return 'e';
}
}
'00'在C中无效,因为字符文字必须由单个字符组成。 '\x00'
表示值为0的字符。使用\x00
表示二进制0x00
,而不是00
。
澄清的示例代码:
#include <stdio.h>
int main()
{
char c = '\x61';
printf("%c\n", c);
return 0;
}
了解我如何定义c
。
然而,我说,我看不出你的方法是如何压缩字符的。
答案 2 :(得分:0)
以下是一个示例代码片段:
unsigned int Compress(char letter_1, char letter_2, char letter3, char letter 4)
{
unsigned int value = 0;
unsigned int result = 0;
value = letter1 - 'A';
result = result << 2; // Shift the old to make room for new bits.
result |= value; // Put in new bits.
value = letter2 - 'A';
result = result << 2; // Shift the old to make room for new bits.
result |= value; // Put in new bits.
value = letter3 - 'A';
result = result << 2; // Shift the old to make room for new bits.
result |= value; // Put in new bits.
value = letter4 - 'A';
result = result << 2; // Shift the old to make room for new bits.
result |= value; // Put in new bits.
return result;
}
这是压缩字母(letter - 'A'
)并打包成unsigned int
(result = result << 2; result |= value;
)的示例。
可能有更高效或更紧凑的方法,但这仅用于演示目的。