我想知道我是否可以使用fread将数据读入整数缓冲区。 我看到fread()将void *作为第一个参数。 所以我不能只传递一个整数缓冲区(类型转换为void *),然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?
即。 我无法做到:
int buffer[10]; fread((void *)buffer, sizeof(int), 10, somefile); // print contents of buffer for(int i = 0; i < 10; i++) cout << buffer[i] << endl;
这有什么不对?
谢谢
如果您使用类似fwrite
(“binary”write)之类的内容将文件写入文件,这应该可以工作。 如果文件是人类可读的(您可以使用文本编辑器打开它并查看有意义的数字),您可能需要fscanf
/ cin
。
正如其他人所说,如果输入是您期望的二进制格式,那么fread应该能够做您想要的。 我要补充的一个警告是,如果输入文件在具有不同大小的整数或不同的字符串(sp)的平台之间移动,则代码将具有平台依赖性并且将无法正常运行。
此外,您应该始终检查您的返回值; 恐惧可能会失败。
是的,您可以使用fread读取整数数组
int buffer[10]; size_t readElements = fread((void *)buffer, sizeof(int), 10, somefile); for(int i = 0; i < readElements; i++) cout << buffer[i] << endl
您可以检查fread返回打印输出的元素数量。
编辑:如果您正在以二进制模式从文件中读取,并且值被写为带有fwrite的cnicutar。
我正在尝试相同的结果并获得与您相同的结果,尝试使用文件中的fread()
读取整数时的大int值,最后得到了它的原因。 因此,假设您的输入文件仅包含:
我从https://www.programmersheaven.com/mb/beginnercpp/396198/396198/fread-returns-invalid-integer/获得的详细信息
fread()
读取二进制数据(即使文件以’text’模式打开)。 hex的数字540352565
是0x20352035
是0x20
的ASCII代码, 0x35
是'5'
的ASCII代码(因为使用了小端机器,它们的顺序相反)。
所以fread
所做的就是从文件中读取ASCII代码并从中构建一个int,期望二进制数据。 这应该解释读取'5 5 5'
文件时的行为。 使用单个'5'
读取文件时也会发生相同的情况,但只能读取一个字节(如果后面跟一个换行符,则只读取两个),如果读取的字节数小于sizeof(int)
,则fread
应该失败(在这种情况下)。
由于对响应的反应是它仍然不起作用,我将在这里提供完整的代码,因此您可以尝试一下。
请注意,以下代码不包含正确的检查,如果文件不存在则CAN崩溃,没有内存,没有权限等。在代码中应添加检查每个打开,关闭,读取和写入操作。
而且,我会动态分配缓冲区。
int* buffer = new int[10];
那是因为当普通数组作为指针时我感觉不舒服。 但是无所谓。 还请注意,根据数字范围,应使用正确的类型(uint32_t,16,8,int,short …)来节省空间。
以下代码将创建文件并写入正确的数据,然后您可以读取。
FILE* somefile; somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "wb"); int buffer[10]; for(int i = 0; i < 10; i++) buffer[i] = 15; fwrite((void *)buffer, sizeof(int), 10, somefile); // print contents of buffer for(int i = 0; i < 10; i++) cout << buffer[i] << endl; fclose(somefile); somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "rb"); fread((void *)buffer, sizeof(int), 10, somefile); // print contents of buffer for(int i = 0; i < 10; i++) cout << buffer[i] << endl; fclose(somefile);
以上就是c/c++开发分享使用fread读入int缓冲区相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522115.html