根据文件大小分配内存不正确?
Allocate memory based on filesize has not the correct number?
我想将文件内容存储在动态字符串指针值中。
这是我的代码:
char *strPtr = NULL;
char tmpChar = "";
inputFile = fopen(input_file, "r");
fseek(inputFile, 0, SEEK_END); // seek to end of file
fileSize = ftell(inputFile); // get current file pointer
rewind(inputFile);
strPtr = (char*) realloc(strPtr, fileSize * sizeof(char));
int counter = 0;
while ((tmpChar = fgetc(inputFile)) != EOF)
{
strPtr[counter] = tmpChar;
counter++;
if (counter == fileSize)
printf("OK!");
}
printf("Filesize: %d, Counter: %d", fileSize,counter);
现在是我的问题...使用最后一个 printf 我得到 2 个不同的值,例如:文件大小 127 和计数器 118。
另外在我的 strPtr-Variable 的末尾有一个错误的输入,如“ÍÍÍÍÍÍÍÍÍýýýýüe”。
Notepad++ 在文件末尾还说我在第 127 位,那么 118 的问题是什么?
如果您在 Windows 上以文本模式(默认)打开文件,CRT 文件函数会将任何 \r\n
转换为 \n
。这样做的效果是您阅读的每一行都将比 \r\n.
的原始行短 1 个字节
要防止此类转换,请使用 "binary" 模式,方法是添加 "b" 模式修饰符,例如"rb".
inputFile = fopen("example.txt", "rb")
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=vs-2019
In text mode, carriage return-linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return-linefeed combinations on output.
while ((tmpChar = fgetc(inputFile)) != EOF)
{
strPtr[counter] = tmpChar;
counter++;
if (counter == fileSize)
printf("OK!");
}
此外,假设文件不 包含 任何 NULL 值,此循环不会以 null 终止您的字符串。如果您稍后以预期的方式使用 strPtr
(例如 printf
、strcmp
等),它将读取超出有效范围。
如果你确实想要一个空终止符,你需要在后面添加一个。为此,您还需要确保分配了一个额外的字节。
realloc(strPtr, (fileSize + 1) * sizeof(char));
while (...
strPtr[counter] = '[=12=]'; // Add null terminator at end.
要处理可能包含空值的 files/strings,您根本不能使用以空值结尾的字符串(例如,使用大小为 memcmp
而不是 strcmp
)。
我想将文件内容存储在动态字符串指针值中。 这是我的代码:
char *strPtr = NULL;
char tmpChar = "";
inputFile = fopen(input_file, "r");
fseek(inputFile, 0, SEEK_END); // seek to end of file
fileSize = ftell(inputFile); // get current file pointer
rewind(inputFile);
strPtr = (char*) realloc(strPtr, fileSize * sizeof(char));
int counter = 0;
while ((tmpChar = fgetc(inputFile)) != EOF)
{
strPtr[counter] = tmpChar;
counter++;
if (counter == fileSize)
printf("OK!");
}
printf("Filesize: %d, Counter: %d", fileSize,counter);
现在是我的问题...使用最后一个 printf 我得到 2 个不同的值,例如:文件大小 127 和计数器 118。 另外在我的 strPtr-Variable 的末尾有一个错误的输入,如“ÍÍÍÍÍÍÍÍÍýýýýüe”。
Notepad++ 在文件末尾还说我在第 127 位,那么 118 的问题是什么?
如果您在 Windows 上以文本模式(默认)打开文件,CRT 文件函数会将任何 \r\n
转换为 \n
。这样做的效果是您阅读的每一行都将比 \r\n.
要防止此类转换,请使用 "binary" 模式,方法是添加 "b" 模式修饰符,例如"rb".
inputFile = fopen("example.txt", "rb")
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=vs-2019
In text mode, carriage return-linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return-linefeed combinations on output.
while ((tmpChar = fgetc(inputFile)) != EOF) { strPtr[counter] = tmpChar; counter++; if (counter == fileSize) printf("OK!"); }
此外,假设文件不 包含 任何 NULL 值,此循环不会以 null 终止您的字符串。如果您稍后以预期的方式使用 strPtr
(例如 printf
、strcmp
等),它将读取超出有效范围。
如果你确实想要一个空终止符,你需要在后面添加一个。为此,您还需要确保分配了一个额外的字节。
realloc(strPtr, (fileSize + 1) * sizeof(char));
while (...
strPtr[counter] = '[=12=]'; // Add null terminator at end.
要处理可能包含空值的 files/strings,您根本不能使用以空值结尾的字符串(例如,使用大小为 memcmp
而不是 strcmp
)。