gpt4 book ai didi

c - 尾随换行符

转载 作者:行者123 更新时间:2023-11-30 18:36:33 24 4
gpt4 key购买 nike

我有一个包含 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] = '\0';
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")] = '\0';

最佳答案

有关代码的一些注释:

  • 您必须 line不再如此fgets()可以阅读'\n'进入line 。目前,它将每行分成 8 字节 block 和带有换行符的空行。

  • 您应该阻止 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] = '\0';
}
}
fclose(file_pointer);
}

您可能还想验证 mem[] 中的字符串是否存在通过简单循环并使用 isxdigit() 恰好包含 8 个十六进制数字来自 <ctype.h> 的函数:

            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] = '\0';
}

关于c - 尾随换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com