Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自c+的fread+;返回错误值的二进制文件_C++_File Io_Binaryfiles_Fread_Stdio - Fatal编程技术网

C++ 来自c+的fread+;返回错误值的二进制文件

C++ 来自c+的fread+;返回错误值的二进制文件,c++,file-io,binaryfiles,fread,stdio,C++,File Io,Binaryfiles,Fread,Stdio,我正在尝试使用stdio.h将一些布尔网格读写到文件中。用户输入一个数字nx(通常从1到10),程序通过ceil(nx/2)布尔网格(ceil(nx/2)isny)生成一个nx列表。网格本身存储在\uuu int64s中,因此该网格(f为假,T为真): 将是172(10101100) 网格的结束列表将输出到二进制文件 我的代码: std::vector<__int64> grids; ... FILE *cFile; if (fopen_s(&cFile, ("grid_

我正在尝试使用
stdio.h
将一些布尔网格读写到文件中。用户输入一个数字
nx
(通常从1到10),程序通过
ceil(nx/2)
布尔网格(
ceil(nx/2)
is
ny
)生成一个
nx
列表。网格本身存储在
\uuu int64
s中,因此该网格(
f
为假,
T
为真):

将是172(10101100)

网格的结束列表将输出到二进制文件

我的代码:

std::vector<__int64> grids;

...

FILE *cFile;
if (fopen_s(&cFile, ("grid_" + std::to_string(nx) + "_c.bin").c_str(), "wb") != 0) return;

for (int i = 0; i < grids.size(); i++) {
    fwrite(&grids[i], (int) ceil((nx * ny) / 8), 1, cFile);
}

fclose(cFile);
std::矢量网格;
...
文件*c文件;
if(fopen_s(&cFile,(“grid_”+std::to_string(nx)+“_c.bin”).c_str(),“wb”)!=0)返回;
对于(int i=0;i
这部分很好用


然而,当我试图从文件中读取时,所有的网格都是-858993460,不管大小如何,尽管它得到了正确的网格数。我的阅读代码:

FILE *cFile;
if (fopen_s(&cFile, ("grid_" + std::to_string(nx) + "_c.bin").c_str(), "rb") != 0) return;

fseek(cFile, 0, SEEK_END);
long size = ftell(cFile);

int grids = size / ((nx * ny) / 8);

for (int n = 0; n < shapes; n++) {
    __int64 data;
    fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
    printf("%i\n", data);
}

fclose(cFile);
文件*cFile;
if(fopen_s(&cFile,(“grid_”+std::to_string(nx)+“_c.bin”).c_str(),“rb”)!=0)返回;
fseek(cFile,0,SEEK_END);
长尺寸=ftell(cFile);
整数网格=大小/((nx*ny)/8);
对于(int n=0;n
我做错了什么


如果你需要更多的信息来回答,请留下评论,我会给你的


提前谢谢

我认为你在用奇怪的方式使用
fwrite
fread
。请做

 fwrite(&gris[i], sizeof(__int64), 1, cFile);
倾倒和

 fread(&data, sizeof(__int64), 1, cFile);

用于恢复。

我认为您正在以奇怪的方式使用
fwrite
fread
。请做

 fwrite(&gris[i], sizeof(__int64), 1, cFile);
倾倒和

 fread(&data, sizeof(__int64), 1, cFile);

用于恢复。

我认为您正在以奇怪的方式使用
fwrite
fread
。请做

 fwrite(&gris[i], sizeof(__int64), 1, cFile);
倾倒和

 fread(&data, sizeof(__int64), 1, cFile);

用于恢复。

我认为您正在以奇怪的方式使用
fwrite
fread
。请做

 fwrite(&gris[i], sizeof(__int64), 1, cFile);
倾倒和

 fread(&data, sizeof(__int64), 1, cFile);

用于恢复。

问题

问题是您正在使用以下命令将
文件*
移动到文件末尾:

fseek(cFile, 0, SEEK_END);
然后,您尝试读取数据而不返回文件的开头

您没有检查以下项的返回值:

fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
检查读取是否成功

修复

添加行

fseek(cFile, 0, SEEK_SET);
倒带文件

始终检查读取操作的返回值

if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
   // Successful read.
   // Use the data
}

问题

问题是您正在使用以下命令将
文件*
移动到文件末尾:

fseek(cFile, 0, SEEK_END);
然后,您尝试读取数据而不返回文件的开头

您没有检查以下项的返回值:

fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
检查读取是否成功

修复

添加行

fseek(cFile, 0, SEEK_SET);
倒带文件

始终检查读取操作的返回值

if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
   // Successful read.
   // Use the data
}

问题

问题是您正在使用以下命令将
文件*
移动到文件末尾:

fseek(cFile, 0, SEEK_END);
然后,您尝试读取数据而不返回文件的开头

您没有检查以下项的返回值:

fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
检查读取是否成功

修复

添加行

fseek(cFile, 0, SEEK_SET);
倒带文件

始终检查读取操作的返回值

if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
   // Successful read.
   // Use the data
}

问题

问题是您正在使用以下命令将
文件*
移动到文件末尾:

fseek(cFile, 0, SEEK_END);
然后,您尝试读取数据而不返回文件的开头

您没有检查以下项的返回值:

fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
检查读取是否成功

修复

添加行

fseek(cFile, 0, SEEK_SET);
倒带文件

始终检查读取操作的返回值

if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
   // Successful read.
   // Use the data
}

在这里使用
ceil
的目的是什么?@RSahu它使输出成为整数字节数。不使用
ceil
将进行四舍五入,因此603将最终为91。在此处使用
ceil
的目的是什么?@RSahu它使输出为整数字节数。不使用
ceil
将进行四舍五入,因此603将最终为91。在此处使用
ceil
的目的是什么?@RSahu它使输出为整数字节数。不使用
ceil
将进行四舍五入,因此603将最终为91。在此处使用
ceil
的目的是什么?@RSahu它使输出为整数字节数。不使用
ceil
将进行四舍五入,因此603将最终为91。
sizeof(uu int64)
将始终返回8。我正在寻找尽可能小的文件大小,因此我使用
(int)ceil((nx*ny)/8)
,这是尽可能小的文件大小。是的,但要存储单个项目,必须至少指定1个字节。元素大小与数组大小无关。每个数组都是
nx
by
ny
yes,但在写入时通过&grids[i](即a u int64*),fwrite考虑元素的字节:第二个参数不能用于写入单个位,最小值为1字节。fread也是如此。
sizeof(\uu int64)
总是返回8。我正在寻找尽可能小的文件大小,因此我使用
(int)ceil((nx*ny)/8)
,这是尽可能小的文件大小。是的,但要存储单个项目,必须至少指定1个字节。元素大小与数组大小无关。每个数组都是
nx
by
ny
yes,但在写入时通过&grids[i](即a u int64*),fwrite考虑元素的字节:第二个参数不能用于写入单个位,最小值为1字节。fread也是如此。
sizeof(\uu int64)
总是返回8。我正在寻找尽可能小的文件大小,因此我使用
(int)ceil((nx*ny)/8)