尾随换行符
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=]';
}
我有一个包含 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=]';
}