- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 C 代码(使用 VS 2015)无法完全读取包含多个 4 字节有符号整数 (int32) 的文件,而二进制查看器程序显示文件中的数据没有问题(图 1)。我尝试了几种读取数据文件的方法,结果相似。我的问题只是下面的示例代码中有什么不正确的地方?如果代码没有问题,那么数据文件可能有什么问题?
如果有人有时间和兴趣检查它,我在下面提供了示例数据文件的链接。在两个代码示例(如下)中,读取在整数 78 处停止,根据二进制查看器,该值 = 26。
示例代码1:
typedef signed __int32 INT32;
FILE *fp = NULL;
INT32 k;
int i=0;
fp = fopen(myfilePath, "r");
while(!feof(fp))
{
fread(&k,sizeof(INT32),1,fp);
printf("a[%d] = %d\n",i,k);
i++;
}
fclose(fp);
示例代码2:
typedef signed __int32 INT32;
FILE *fp = NULL;
long sz=0;
INT32 k;
int i=0
fp = fopen(myfilePath, "r");
// find the size of the file
fseek(fp, 0L, SEEK_END);
sz = ftell(fp)/4; // store the Int32 data count
rewind(fp);
for(i=0;i<sz;i++)
{
fread(&k,sizeof(INT32),1,fp);
printf("a[%d] = %d\n",i,k);
}
fclose(fp);
Link to example data file. Size: 3,572 bytes. Contains 893 Int32 values
感谢您的帮助!
最佳答案
您的输入文件中的内容稍微偏离了目标。您的输入文件提供文件中包含的 32 位整数的数量作为第一个值。您只需读取第一个整数即可知道需要为其余值分配多少存储空间。
标准 C 库不是使用 typedef
来表示有符号 32 位整数,而是提供了 stdint.h
header ,其中包含所有精确宽度类型,包括有符号32 位类型已作为 int32_t
提供。 inttypes.h
header 提供了用于打印和读取精确宽度类型的宏(例如 PRId32
用于打印,其中 d
可以是 u
无符号、x
十六进制、o
八进制或 i
整数,例如 SCNd32
用于扫描f)
因此,您真正需要做的就是打开文件进行读取(使用 "rb"
作为可移植性模式,'b'
不这样做任何内容,并且是为了 C89 兼容性而提供的)您打开文件并将第一个 32 位值读入变量。这会告诉您后面有多少个 32 位值 - 并使文件位置指示器准备好读取剩余的值,例如
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main (int argc, char **argv) {
int32_t *a = NULL, nint = 0; /* pointer and no. of int */
/* use filename provided as 1st argument ("000002.dat" by default) */
FILE *fp = fopen (argc > 1 ? argv[1] : "000002.dat", "rb");
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
/* read no. of int32_t values from 1st value in file */
if (fread (&nint, 1, sizeof nint, fp) != sizeof nint) {
perror ("fread-nint");
return 1;
}
...
现在只需使用 malloc()
(推荐)为剩余值分配存储空间,或者您可以声明一个可变长度数组,但您应该检查变量的数量值以确保您不会尝试声明超出堆栈大小的数组 - 这将取决于编译器/操作系统。 MS 通常提供 1M 堆栈,因此您应该能够声明大约 200K 整数的 VLA——与您拥有的任何其他堆栈使用相平衡。使用 malloc
进行简单的动态分配将消除 StackOverflow 的风险...
...
/* allocate/validate storage */
if (!(a = malloc (nint * sizeof nint))) {
perror ("malloc-a");
return 1;
}
...
剩下的就是使用 fread
从文件中读取其余值。 fread
函数读取多个给定大小的 block ,并将结果存储在提供的地址中。因此,您只想读取 sizeof nint
的 nint
值(或者您可以使用 sizeof *a
- 两者都是相同的类型)。返回将是从文件中读取的该大小的 block 的数量。您可以通过以下方式读取剩余值:
...
/* read remaining values from file into a */
if (fread (a, sizeof nint, (size_t)nint, fp) != (size_t)nint) {
perror ("fread-a");
return 1;
}
fclose (fp); /* close file */
...
(注意:始终验证您的分配是否成功,并通过检查 fread
的返回来验证您从文件中的读取。)
确认从文件中读取的 32 位值的数量的完整示例可能是:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main (int argc, char **argv) {
int32_t *a = NULL, nint = 0; /* pointer and no. of int */
/* use filename provided as 1st argument ("000002.dat" by default) */
FILE *fp = fopen (argc > 1 ? argv[1] : "000002.dat", "rb");
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
/* read no. of int32_t values from 1st value in file */
if (fread (&nint, 1, sizeof nint, fp) != sizeof nint) {
perror ("fread-nint");
return 1;
}
/* allocate/validate storage */
if (!(a = malloc (nint * sizeof nint))) {
perror ("malloc-a");
return 1;
}
/* read remaining values from file into a */
if (fread (a, sizeof nint, (size_t)nint, fp) != (size_t)nint) {
perror ("fread-a");
return 1;
}
fclose (fp); /* close file */
/* report number of integers read */
printf ("%d int32_t read from file.\n", nint);
}
示例使用/输出
使用您提供的链接的文件,并将要读取的文件名作为程序的第一个参数传递(或默认从当前目录中的文件读取),您将得到:
$ ./bin/freadint32_t ../dat/000002.dat
892 int32_t read from file.
文件中的值
如果通过添加一个简单的循环来输出文件中的值,您会发现:
16 25 22 11 17 20 19 23 22 16
17 22 25 25 18 22 24 17 15 18
25 14 14 29 16 14 23 23 21 20
28 24 17 22 18 21 22 24 27 16
16 21 22 30 28 18 23 20 15 23
20 19 22 22 23 20 18 20 28 22
21 22 20 30 21 17 24 22 21 18
19 20 20 25 22 20 30 26 25 33
21 15 23 22 19 17 17 20 21 21
27 35 27 19 21 22 19 13 18 18
12 20 25 22 24 21 20 26 22 24
30 22 18 22 20 16 18 23 22 24
23 17 22 22 17 23 22 16 24 25
20 18 18 25 24 23 22 17 23 26
22 16 17 25 27 24 23 26 23 20
24 17 10 23 22 13 20 16 16 22
18 23 25 20 28 24 21 26 22 24
22 24 25 19 26 28 21 18 21 25
24 19 20 21 19 20 19 19 18 29
...
25 23 18 19 25 23 19 23 22 18
22 19 16 15 13 25 26 23 26 20
23 16 14 23 20 23 22 24 26 19
20 18
读取所有 892 个值。
仔细检查一下,如果您还有其他问题,请告诉我。
关于c - 使用 C 无法读取 4 字节整数 (Int32) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59616985/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!