读取文件的大小错误
Size error on read file
已解决
我正在尝试制作一个简单的文件加载器。我的目标是将着色器文件(纯文本文件(中的文本获取到稍后将编译的 char* 中。
我试过这个功能:
char* load_shader(char* pURL)
{
FILE *shaderFile;
char* pShader;
// File opening
fopen_s( &shaderFile, pURL, "r" );
if ( shaderFile == NULL )
return "FILE_ER";
// File size
fseek (shaderFile , 0 , SEEK_END);
int lSize = ftell (shaderFile);
rewind (shaderFile);
// Allocating size to store the content
pShader = (char*) malloc (sizeof(char) * lSize);
if (pShader == NULL)
{
fputs ("Memory error", stderr);
return "MEM_ER";
}
// copy the file into the buffer:
int result = fread (pShader, sizeof(char), lSize, shaderFile);
if (result != lSize)
{
// size of file 106/113
cout << "size of file " << result << "/" << lSize << endl;
fputs ("Reading error", stderr);
return "READ_ER";
}
// Terminate
fclose (shaderFile);
return 0;
}
但是正如您在代码中看到的那样,我在过程结束时有一个奇怪的大小差异,这使我的函数崩溃。
我必须说我是 C 语言的初学者,所以我可能错过了一些关于内存分配、类型、指针的微妙之处......如何解决此尺寸问题?
*编辑1:
首先,我不应该在最后返回 0,而是返回 pShader;这似乎是导致程序崩溃的原因。然后,我将结果类型更改为 size_t,并向 pShader 添加一个结束字符,添加 pShdaer[result] = '/0';在声明之后,所以我可以正确显示它。最后,正如@JamesKanze所建议的那样,我把fopen_s变成了 fopen,因为前一个在我的情况下没有用。
首先,对于这种原始访问,您可能更好使用系统级功能:CreateFile
或open
, ReadFile
或read
和CloseHandle
或close
,与 GetFileSize
或stat
才能获得尺寸。 使用 FILE*
或 std::filebuf
只会引入额外的缓冲和处理,在您的情况下没有任何收益。
至于你所看到的:不能保证ftell
将返回任何可利用的数值;它可以很好,只是一个神奇的饼干。 在大多数当前系统上,它是物理文件中的字节偏移量,但在任何非 Unix 上系统,偏移量不会直接映射到物理文件中到您正在读取的逻辑文件,除非您在 中打开该文件二进制模式。 如果使用"rb"
打开文件,您将可能看到相同的值。 (理论上,你可以得到文件末尾的额外 0,但实际上,操作系统的发生这种情况的地方要么已经灭绝,要么仅用于遗产大型机。
编辑:
由于说明这一点的答案已被删除:您应该循环在fread
上,直到它返回 0(在之前将errno
设置为 0(每次调用,并在返回后检查它以查看是否由于错误或因为它到达文件结尾(。 话虽如此:如果你在平常之一Windows或Unix系统,并且文件是计算机的本地文件,而且不会太大,fread
会一口气读完。 这您看到的大小差异(给定数值你发布(几乎可以肯定是由于这两个事实字节 Windows 行尾正在映射到单个'n'
字符。 为避免这种情况,您必须以二进制模式打开;或者,如果您真的在处理文本(并且想要此映射(,您可以忽略缓冲区, 在最后一个字节之后设置' '
终止符实际阅读。
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何在文件和行号中抛出错误
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- AMQP-CPP >处理程序中的错误文件描述符
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- 为什么生成文件返回 g++: 错误: h 文件或目录 make: *** [生成文件:12: 测试] 错误 1?
- 警告:打开错误文件(/build/opencv/modules/videoio/src/cap_ffmpeg_impl.
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- main.cc:5:30:致命错误:文件夹/file.h:没有这样的文件或目录
- C++ LNK2005"已定义"错误 - 文件引用自身
- C++:模拟餐饮公司计费程序-无法将错误数据输出到错误文件
- 博兰德C++链接器错误c文件包括
- Visual Studio 2015 代码覆盖率错误文件
- 使用system()与Gnuplot进行绘图会导致错误:文件不可读
- 是否存在fseek/ftell可能给出错误文件大小的情况
- g++编译错误.h文件
- c++编译错误:.o文件未找到
- 打开错误文件的错误消息
- Ndk-build输出添加符号错误.文件格式错误