我正在尝试检查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,它把文件读成二进制。
读每一个这样出现的字符:

#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;
}

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

关于c - 在C中的ASCII文件中查找不可打印的ASCII字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51308312/

10-13 08:24