C++ 文件 readInt 函数? (来自二进制文件)

标签 c++ file binary

是否有一个 FILE (fopen?) 函数可以让我从二进制文件中读取一个整数?

到目前为止我正在尝试这个,但是我遇到了某种我看不到的错误,因为程序在没有告诉我的情况下崩溃了。

void opentest()
{
    FILE *fp = fopen("dqmapt.mp", "r");
    int i = 0;
    int j = 0;
    int k = 0;
    int * buffer;
    if (fp)
    {
        buffer = (int *) (sizeof(int));

        i = (int) fread(buffer,1, (sizeof(int)), fp);
        fscanf(fp, "%d", &j);
        fclose(fp);
    }

    printf("%d\n", i);
    printf("%d\n", j);
}

最佳答案

现在你已经改变了你的问题,让我问一个。您尝试读取的文件格式是什么?

对于二进制文件,打开文件的方式需要进行一些更改:

/* C way */
FILE *fp = fopen("text.bin", "rb"); /* note the b; this is a compound mode */

/* C++ way */
std::ifstream ifs("test.txt", ios::in | ios::binary);

阅读内容很容易。但请记住,您的文件开头有 2 个整数——宽度和高度,它们决定了要读取的数量,即另一个宽度 * 高度的整数数。所以,最好的办法是先读取前两个整数。您将需要使用两个缓冲区——一个用于宽度和高度,然后另一个缓冲区根据它们的值读取文件的其余部分。所以,让我们读入前两个整数:

char buf[ 2 * sizeof(int) ]; /* will store width and height */

读入两个整数:

/* C way */
fread(buf, sizeof(int), 2, fp); /* the syntax changes, FILE pointer is last */

/* C++ way*/ 
ifs.read(buf, sizeof buf);

现在,棘手的部分。您必须将这些东西转换为两倍。这又取决于您的系统字节顺序——简单的分配是否有效或是否需要字节交换。正如另一位发帖人指出的那样,WriteInt() 以大端格式写入整数。弄清楚你在什么系统上。然后您可以继续进行。

FILE 是一个 C 数据结构。它包含在 C++ 中以实现 C 兼容性。你可以这样做:

/* The C way */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   FILE *fp = fopen("test.txt", "r");
   int i = 0;
   if (fp) {
      fscanf(fp, "%d", &i);
      fclose(fp);
   }
   printf("%d\n", i);
}

您可以使用std::ifstream 来打开文件进行读取。您必须使用其他一些咒语来读取文件内容,然后自己从中提取所需的信息。

/* The C++ way */
#include <fstream>
#include <iostream>

int main() {
   std::ifstream ifs("test.txt");
   int i = 0;
   if (ifs.good()) {
      ifs >> i;
   }
   std::cout << i << std::endl;
}

请注意,您也可以在 C++ 中使用 C 风格的函数,尽管这是最不推荐的方式:

/* The C way in C++ */
#include <cstdio>
#include <cstdlib>

int main() {
   using namespace std;
   FILE *fp = fopen("test.txt", "r");
   int i = 0;
   if (fp) {
      fscanf(fp, "%d", &i);
      fclose(fp);
   }
   printf("%d\n", i);
}

[注意:这两个示例都假设您有一个文本文件可供读取]

关于C++ 文件 readInt 函数? (来自二进制文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/599996/

相关文章:

c++ - 垃圾收集在内存中移动引用的对象会破坏 Unreal4 引擎中的引用吗?

c++ - Posix 线程 -(互斥量和条件变量)问题,

c++ - 应用程序未从 COM 端口接收串行数据 - C++

java.io.File 与 java.nio.Files 哪个是新代码中的首选?

java - 使用 BufferedReader 和 FileReader 从文件中读取

java - 在字符串变量中携带一个小图像文件?

c++ - std::stringstream.str() 总是返回相同的字符串吗?

python - 如何将文本文件制作成数组列表(数组中的数组)并删除空格/换行符

Python:读取 12 位压缩二进制图像

python - 十进制到二进制 : two's complement, 更好的负数表达