是否有FILE(fopen?)函数允许我从二进制文件中读取一个int?
到目前为止,我正在尝试这个,但是我遇到了一些我无法看到的错误导致程序在没有告诉我的情况下崩溃。
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);
}
答案 0 :(得分:7)
现在你已经改变了你的问题,让我问一个问题。您尝试阅读的文件格式是什么?
对于二进制文件,打开文件时需要进行一些更改:
/* 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);
阅读内容很简单。但请记住,您的文件在开头有两个整数 - 宽度,高度,它决定了读取多少个,即另一个宽度*高度的整数。所以,最好的办法是先读取前两个整数。您将需要使用两个缓冲区 - 一个用于宽度和高度,然后根据它们的值另一个用于读取文件的其余部分。所以,让我们读一下前两个整数:
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()
以big-endian格式写入整数。弄清楚你在使用什么系统。然后你可以继续前进。
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);
}
[注意:两个示例都假设您有一个要读取的文本文件]
答案 1 :(得分:2)
您想阅读int的文本表示吗?然后你可以使用fscanf,它与printf
相反int n;
if( fscanf(filePointer, "%d", &n) == 1 )
// do stuff with n
如果你想阅读一些二进制数据并将其视为一个int,那么这首先取决于它是如何编写的。
我不是Java程序员,所以这只是基于我在[docs]中所读到的内容(http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataOutputStream.html#writeInt(int))。
那说,它说
将int作为四个字节写入基础输出流,首先是高字节。如果没有抛出异常,则写入的计数器将增加4。
所以这是一个大端的四字节整数。我不知道它是否是两个补码,但这可能是一个安全的假设(并且可能在java docs / spec中找到)。 Big endian与网络字节顺序相同,因此您可以使用ntohl
将其转换为C ++平台的字节顺序。除此之外,您只需要读取四个字节,这可以通过fread
完成。
答案 2 :(得分:0)
Int表示为文本或二进制文件?
对于文字,请使用fscanf
;对于二进制文件,请使用fread
。