【发布时间】:2013-11-23 22:58:16
【问题描述】:
我正在尝试从文本文件中读取,对于非打印 ascii 字符,我想打印出“^”+“G”作为 BELL 字符的示例。很像 unix 的 cat -v 命令。问题发生在我应该存储字符的 for 循环中,直到我点击换行符然后将它们打印出来。 for 循环为 ctrl+G 打印“G”,为测试打印“t”“e”“s”“t”。
int readFile(FILE* inputFile) {
char input[5];
char *arrayEnd = &input[5]+1;
int anyChanges = 1;
int iochar = 0;
int i = 0;
//get index of new line
//substring of position until new line
//print substring position to end.
int printedColumns = 0;
//credit Foster Chapter 2
while (( iochar = getc(inputFile) ) != EOF )
{ //Returns 1 if no changes made, return 0 if any changes have been made.
//printf("character --> %c\n",iochar);
if(iochar != '\n') {
//This if statement checks for normal ascii characters.
//If the output is less than 72 it prints it and increments printedColumns.
if (( ' ' <= iochar ) && ( iochar <= 126 ) ) {
if(*(input + i) == *arrayEnd)
{
i = 0;
}
*(input +i) = iochar;
//printf("input array ---> %c\n",input[i]);
//printf("i:%d\n",i);
//printf("iochar:%d\n",iochar);
//putc(*(input+i), stdout);
i++;
}
//This if statement checks for the non-printing characters.
//New line is not included because it is a special case that is accounted for below
if (iochar <= 31) {
if (*(input + i) == *arrayEnd)
{
i = 0;
}
*(input + i) =94;
putc(*(input+i), stdout);
i++;
if(*(input+i)== *arrayEnd)
{
i = 0;
}
*(input + i) = iochar + 64;
putc(*(input+i), stdout);
printf("\n");
i++;
}
int b = 0;
for (b = 0;b<6;b++){
putc(*(input+b),stdout);
}
}//end if != '\n'
}//end while
return anyChanges;
}//end function
【问题讨论】:
-
man ctype, esp isprint
-
不要使用数字;使用像
'^'这样的字符常量而不是94。为什么不在阅读时输出每个字符的翻译?您使用的微小(5 个字符)缓冲区有什么好处? -
我想最终打印最后 72 列,所以我将缓冲区变小以进行测试。
标签: c