为什么编译器在读取文本文件时会分配多余的内存?
Why does the compiler allocate excess memory when reading a text file?
我正在尝试将文本文件读入动态字符串(char *
数组)。
- 最初,我使用
fileLength = ftell(textFile);
获取文件的长度,调试器报告 fileLength = 214
。我手动检查了 VSCode 上的文件长度:在编辑器中打开文件并使用 <ctrl+a>
选择所有字符;所选字符数再次报告为 214。
- 然而,当调试器在
while
循环中命中 if
块时,我意识到,指针 tmp
距离 [=18= 仅 202 个字符(202 字节) ](字符串的头部)。
- 奇怪的是,差异 (214 - 202 = 12) 对应于文本文件中的行数。那个巧合让我这么想;在计算长度(字符数)时,编译器将
eol
视为 \r\n
但在实际读取字符时,eol
被识别为 \n
(我在 Windows).
有人可以详细说明我的怀疑是对还是错吗?
char *FileTextRead(const char *fileName) {
char c = 0;
char *src = NULL;
char *tmp = NULL;
size_t head = 0L;
size_t fileLength = 0L;
FILE *textFile = fopen(fileName, "r");
if (textFile == NULL) {
printf("cannot open file : %s\n", fileName);
}
else {
// save head position of file
head = ftell(textFile);
// go to end of file to get number of chars
fseek(textFile, 0L, SEEK_END);
fileLength = ftell(textFile);
// rewind file to the head
fseek(textFile, head, SEEK_SET);
src = malloc((fileLength + 1) * sizeof(char));
if (src == NULL) {
printf("failed to allocate memory...\n");
}
else {
tmp = src;
while (TRUE) {
c = getc(textFile);
if (feof(textFile)) {
*tmp = '[=10=]';
break;
}
*tmp = c;
tmp++;
}
}
fclose(textFile);
}
return src;
}
不要忘记 fopen()
在 二进制模式 如果这很重要,它可以在某些平台上:
FILE *textFile = fopen(fileName, "rb");
我正在尝试将文本文件读入动态字符串(char *
数组)。
- 最初,我使用
fileLength = ftell(textFile);
获取文件的长度,调试器报告fileLength = 214
。我手动检查了 VSCode 上的文件长度:在编辑器中打开文件并使用<ctrl+a>
选择所有字符;所选字符数再次报告为 214。 - 然而,当调试器在
while
循环中命中if
块时,我意识到,指针tmp
距离 [=18= 仅 202 个字符(202 字节) ](字符串的头部)。 - 奇怪的是,差异 (214 - 202 = 12) 对应于文本文件中的行数。那个巧合让我这么想;在计算长度(字符数)时,编译器将
eol
视为\r\n
但在实际读取字符时,eol
被识别为\n
(我在 Windows).
有人可以详细说明我的怀疑是对还是错吗?
char *FileTextRead(const char *fileName) {
char c = 0;
char *src = NULL;
char *tmp = NULL;
size_t head = 0L;
size_t fileLength = 0L;
FILE *textFile = fopen(fileName, "r");
if (textFile == NULL) {
printf("cannot open file : %s\n", fileName);
}
else {
// save head position of file
head = ftell(textFile);
// go to end of file to get number of chars
fseek(textFile, 0L, SEEK_END);
fileLength = ftell(textFile);
// rewind file to the head
fseek(textFile, head, SEEK_SET);
src = malloc((fileLength + 1) * sizeof(char));
if (src == NULL) {
printf("failed to allocate memory...\n");
}
else {
tmp = src;
while (TRUE) {
c = getc(textFile);
if (feof(textFile)) {
*tmp = '[=10=]';
break;
}
*tmp = c;
tmp++;
}
}
fclose(textFile);
}
return src;
}
不要忘记 fopen()
在 二进制模式 如果这很重要,它可以在某些平台上:
FILE *textFile = fopen(fileName, "rb");