我正在编写一个将文件转储为八进制的函数。在达到一行中字符数量的限制后,可以打印出要传入的文件的可打印字符。
由于某种原因,我的程序总是打印文本文件的前16个字符,我将如何打印文件中的其余字符?
这是我用来测试的文本文件:
?asdfadsbgasdfassadfasdfsadfads
asdf
asdf
asd
v
asdf
asdf
asd
f
asdf
以下是stdout的输出:
0000000 77 141 163 144 146 141 144 163 142 147 141 163 144 146 141 163 | ?asdfadsbgasdfas
0000020 163 141 144 146 141 163 144 146 163 141 144 146 141 144 163 15 | ?asdfadsbgasdfas
0000040 12 141 163 144 146 15 12 141 163 144 146 15 12 141 163 144 | ?asdfadsbgasdfas
0000060 15 12 166 15 12 141 163 144 146 15 12 141 163 144 146 15 | ?asdfadsbgasdfas
0000100 12 141 163 144 15 12 146 15 12 141 163 144 146 15 12 ?asdfadsbgasdfa
0000120
这是我的代码:
void octaldump(FILE * fp)
{
int c;
size_t linecount = 0, index = 0, i;
long int address = 0;
char temp [LINESIZE];
while((c = fgetc(fp)) != EOF)
{
if(linecount == 0)
{
printf("%07o ", address);
address += 16;
}
temp[index] = c;
index++;
printf("%02o ", c);
linecount++;
if(linecount == 16)
{
printf(" | ");
for(i = 0; i < linecount; i++)
{
if(temp[i] <= 32)
{
printf(".");
}
else
{
printf("%c", temp[i]);
}
}
printf("\n");
linecount = 0;
}
}
if(linecount < 16)
{
for(i = 0; i < linecount; i++)
{
if(temp[i] <= 32)
{
printf(".");
}
else
{
printf("%c", temp[i]);
}
}
}
printf("\n%07o ", address);
}
答案 0 :(得分:3)
您的问题是,在index
代码之后,您没有将linecount == 16
设置为零。除此之外,这意味着你有一个可怕的缓冲区溢出。
在尾随数据处理中,您应该首先为缺少的字符打印足够的空白,以使可打印字符与其他集对齐。我在评论中使用"%03o"
代替"%02o"
来提供一致的对齐。此外,使用isprint()
中的<ctype.h>
可以改善事情。
这对我来说相当不错 - 在自己的源代码上测试:
#include <ctype.h>
#include <stdio.h>
enum { LINESIZE = 16 };
void octaldump(FILE * fp)
{
int c;
size_t linecount = 0, index = 0, i;
unsigned long address = 0;
char temp [LINESIZE];
while ((c = fgetc(fp)) != EOF)
{
if (linecount == 0)
{
printf("%07lo ", address);
address += 16;
}
temp[index] = c;
index++;
printf("%03o ", c);
linecount++;
if (linecount == 16)
{
printf(" | ");
for (i = 0; i < linecount; i++)
printf("%c", isprint(temp[i]) ? temp[i] : '.');
printf("\n");
linecount = 0;
index = 0;
}
}
if (linecount < 16)
{
for (int j = linecount; j < 16; j++)
printf(" ");
printf(" | ");
for (i = 0; i < linecount; i++)
printf("%c", isprint(temp[i]) ? temp[i] : '.');
printf("\n");
}
printf("%07lo\n", address);
}
int main(void)
{
octaldump(stdin);
return 0;
}