尾随换行符

Trailing newline character

我有一个包含 32 个二进制数的文本文件,每个二进制数都在单独的行中,每个数字的长度为 8 个字符。我想将它们作为字符串存储在 mem 数组中。

现在,此代码如下所示:

    char mem[32][9];
    char line[9];

    FILE *file_pointer;
    file_pointer = fopen(filename, "r");

    if (file_pointer == NULL) {
        printf("Failed to open file \"%s\"!", filename);
    } else {
        int i = 0;
        while (fgets(line, sizeof line, file_pointer)) {
            memcpy(mem[i], line, 8);
            mem[i][8] = '[=10=]';
            i++;
        }
    }
    fclose(file_pointer);

不幸的是,我仍然在 line 中得到换行符,所以我的数组显示不正确。

这是我打印数组时的控制台:

00      00110100
01

02      01111100
03

04      10011100
05

06      10010101
etc...

我打印数组的代码:

for (i = 0; i < 32; i++) {
    if (i >= 10) {
        printf("%d", i);
    } else {
        printf("%c%d", '0', i);
    }
    printf("\t%s\n", mem[i]);
}

我也试过使用:

strtok(line, "\n");

line[strcspn(line, "\r\n")] = '[=13=]';

关于您的代码的一些说明:

  • 您必须使 line 更长,以便 fgets() 可以将 '\n' 读入 line。目前它将每一行分成一个 8 字节的块和一个带有换行符的空行。

  • 您应该防止 while 循环读取超出数组末尾的内容。

这是一个改进的版本

    char mem[32][9] = { 0 };
    char line[80];

    FILE *file_pointer = fopen(filename, "r");

    if (file_pointer == NULL) {
        fprintf(stderr, "Failed to open file \"%s\"!\n", filename);
    } else {
        int i = 0;
        while (i < 32 && fgets(line, sizeof line, file_pointer)) {
            strncat(mem[i], line, 8);
            i++;
        }
        if (i < 32) {
            fprintf(stderr, "Missing values in file \"%s\": found %d lines\n",
                    filename, i);
        }
        fclose(file_pointer);
    }

您也可以这样简化打印代码:

    for (int i = 0; i < 32; i++) {
        printf("%02d\t%s\n", i, mem[i]);
    }

注意,如果你对文件格式有把握,可以这样简化阅读代码:

    char mem[32][9];
    char line[80];

    FILE *file_pointer = fopen(filename, "r");

    if (file_pointer == NULL) {
        fprintf(stderr, "Failed to open file \"%s\"!\n", filename);
    } else {
        if (fread(mem, 9, 32, fp) != 32) {
            fprintf(stderr, "Missing bytes in file %s\n", filename);
        } else {
            for (int i = 0; i < 32; i++) {
                mem[i][8] = '[=12=]';
            }
        }
        fclose(file_pointer);
    }

您可能还想通过一个简单的循环并使用 <ctype.h>:

中的 isxdigit() 函数来验证 mem[] 中的字符串是否恰好包含 8 个十六进制数字
            for (int i = 0; i < 32; i++) {
                int j;
                for (j = 0; j < 8; i++) {
                    if (!isxdigit((unsigned char)mem[i][j])
                        break;
                }
                if (j != 8 || mem[i][8] != \n') {
                    fprintf("invalid data on line %d\n", i + 1);
                }
                mem[i][8] = '[=13=]';
            }