有一个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); }
dirkgently.. 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#include 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#include 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#include 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 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#include 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#include 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#include 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); }
[ 注意:两个示例都假设您有一个要读取的文本文件]