gpt4 book ai didi

c - 根据文件大小分配内存的数量不正确?

转载 作者:行者123 更新时间:2023-11-30 20:08:43 25 4
gpt4 key购买 nike

我想将文件的内容存储在动态字符串指针值中。这是我的代码:

    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 个字节。

要防止此类转换,请使用“二进制”模式,添加“b”模式修饰符,例如“rb”。

inputFile = fopen("example.txt", "rb")

https://learn.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(例如 printfstrcmp 等),它将读取超出有效范围的内容.

如果您确实想要一个空终止符,则需要在后面添加一个。为此,您还需要确保分配了额外的字节。

realloc(strPtr, (fileSize + 1) * sizeof(char));
while (...
strPtr[counter] = '\0'; // Add null terminator at end.

要处理可能包含 null 的文件/字符串,您根本不能使用以 null 结尾的字符串(例如,使用带有 size 的 memcmp 而不是 strcmp)。

关于c - 根据文件大小分配内存的数量不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55674797/

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