【问题标题】:Finding non printable ASCII characters in an ASCII file in C在 C 中的 ASCII 文件中查找不可打印的 ASCII 字符
【发布时间】:2018-07-12 14:31:55
【问题描述】:

我正在尝试检查 ASCII 文件中是否出现不可打印字符(不包括 ASCII 代码 10 或 13)。总体思路是该程序检查输入的文件以确保其符合格式要求,其中之一是仅使用可打印的 ASCII 字符。目前我的代码看起来像这样:

FILE *input_check;
int current_line = 1;
int current_char;

/* opens a new file stream*/
input_check = fopen(filename, "r");

/* Gets the first character*/
current_char = fgetc(input_check);

while (current_char != EOF) {
    if (current_char == 10 || current_char == 13) ++current_line;

    if (current_char < 32 && current_char != 10 && current_char != 13) {
        printf("Found non-printable character with ASCII code %d on line %d 
                    \n", current_char, current_line);
    }

    current_char = fgetc(input_check);
}

fclose(input_check);

我尝试将制表符放入 ASCII 文件中以捕获它们,但输入流将它们视为空格,并将任何连续的空格视为一个字符。有没有办法确保每个字符都输入其原始 ASCII 码?

【问题讨论】:

  • 在我看来,问题在于您将字符“放入”文件而不是代码中的方式。
  • C 有isprint(current_char) 功能。 fgetc 有声明 int fgetc(FILE *stream);,没有第二个参数。
  • 不要忘记 ASCII 127 是不可打印的字符(删除)。虽然使用数值比较没有任何问题,但不要使用幻数,而是使用字符本身,例如if (current_char &lt; ' ' &amp;&amp; current_char != '\r' ... 比 32、10、13 更具可读性(这听起来更像是足球而不是编码)标题 ctype.h 使字符分类更容易 :)
  • 不要使用编程编辑器,它会将 Tab 键转换为空格。
  • 什么是fgetc(input_check,"%1c")

标签: c ascii


【解决方案1】:

因此,考虑到它是 C 语言,您可以采用一种方法将文件作为二进制文件读取。 读取每个字符,因为它们是这样来的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) { 
FILE *fileptr;
int current_char;
int current_line = 0;
int i;

fileptr = fopen(argv[1], "rb");         


while (fread(&current_char, 1, 1, fileptr) == 1) {
    if (current_char == 10 || current_char == 13) ++current_line;

    if (current_char < 32 && current_char != 10 && current_char != 13) {
        printf("Found non-printable character with ASCII code %d on line %d 
                    \n", current_char, current_line);
    }


}  
fclose(fileptr); 
return 0;
}

如果我没有大错特错,这将继续有效,因为每个字符都是一个字节。您将一次从文件中读取一个字节的每个字符。 如果它不起作用,文件是否可以以二进制模式重写?

【讨论】:

  • fread 将指向 char 的指针作为第一个参数,并且循环将永远运行,因为 current_char 永远不会等于 EOF。
  • 糟糕,编辑它,我在我的上面写了他的逻辑,忘记使用 filelen 谢谢@KamilCuk
  • 无论如何,while (fread(&amp;current_char, 1, 1, fileptr) == 1) 不是更简单吗?例如,如果另一个进程在您的程序运行时删除了该文件,这将循环通过最后读取的字符。
  • 请注意——使用fgetcfread 从文件中一次读取一个字节的字符没有任何区别。两个函数都不关心字节是二进制字节还是字符字节——它只是一个字节。
  • 当您现在阅读二进制时,没有 CRLF 翻译,在 DOS/Windows 上您将计算行数两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多