C++中I/O 读取 请教指点..

Potter
博客专家认证
2012-11-06 10:39:10
在网上都搜了一遍,发现我这个问题的资料进来没有?
先说下我的问题:
由于我之前一直从事的是java开发,然后对于I/O的操作非常方便,发现C++却不是如此,不知道是我不知道,还是真的需要进行一些处理后,才能满足我的需求:
java:
DataOutputStream dos = null;
dos.write(0);//写入一个byte
dos.writeUTF("图片名字"); //写入一个名字
...
然后读取的时候,只需要对应的方法去读取就行了,非常方便...
dis =new DataInputStream(is);
dos.readInt();//读取一个byte
imgName = dis.readUTF(); // 读取一个图片名称
....
而C++却在这块就不显得这么容易了,由于我之前用这种方式存储数据的,现在我想一直到c++上面来,所以也就会存在读取一个int值,读取一个图片名字等等..
发现C++中就只有读取字符fread(bytebuff, file_len, 1, fpFile);...
由于刚刚转C++这边,请教前辈指导....
由于我用java的方式存储的数据,然后一个朋友帮我将其转化成16进制文件显示存储了,现在想用C++来类似java中那样方式读取数据....请前辈指教...万分感谢!
...全文
407 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Binzo 2012-11-10
  • 打赏
  • 举报
回复
fstream。std输出文件/设备也是用这个类设定的。
v2nero 2012-11-09
  • 打赏
  • 举报
回复
我的建议是你先把你文件格式研究透了。 然后大不了自己定个结构体。。 然后一读就行了。。 要想向java这么好搞。。。 我想你是在YY.
ww884203 2012-11-09
  • 打赏
  • 举报
回复
引用 16 楼 aa4790139 的回复:
引用 12 楼 turingo 的回复:给你一个二进制文件存取的例子,可以参考参考: C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <string>#include <fstream>#include <iostrea……
16777216是2的24次方。这应该是字节序问题。 32位整数,1的十六进制应该是0x00000001,但是在内存中按小端存储就是01 00 00 00 同理,00 00 00 01被认为是0x01000000,也就是2的24次方。
sduxiaoxiang 2012-11-09
  • 打赏
  • 举报
回复
每次读取多少你自己是知道的 。。格式也是你自己定义的 fread指定读多长 顺序读取就是了 跳读的话fseek,跳到哪你自己也清楚
hongwenjun 2012-11-08
  • 打赏
  • 举报
回复
引用 12 楼 turingo 的回复:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

typedef struct {
    int x;
    int y;
} point_t;

/* test.dat  0x10 等于16, 写入16字节长度字符串, 再接着写入一个8字节的结构体
00000000h: 10 00 00 00 59 6F 75 20 61 72 65 20 77 65 6C 63 ; ....You are welc
00000010h: 6F 6D 65 21 50 00 00 00 33 00 00 00             ; ome!P...3...
*/
int main(int argc, char* argv[])
{
    /* 二进制文件的写入 */
    ofstream ofs("test.dat", ios::binary);
    /* 写入字符串 */
    string a = "You are welcome!";
    int n = a.size();
    ofs.write((char*)&n, sizeof(int));
    ofs.write(a.c_str(), sizeof(char) * n);
    /* 写入结构体 */
    point_t b = {80, 51};
    ofs.write((char*)&b, sizeof(point_t));
    ofs.close();

    /* 二进制文件读取 */
    ifstream ifs("test.dat", std::ios::binary);
    /* 读取字符串 */
    int m;
    ifs.read((char*)&m, sizeof(int));
    char* c = new char[m + 1];
    ifs.read(c, sizeof(char) * m);
    c[m] = '\0';
    /* 读取结构体 */
    point_t d;
    ifs.read((char*)&d, sizeof(point_t));
    ifs.close();

    /* 显示读取数据 */
    cout << c << endl;
    cout << '(' << d.x << ',' << d.y << ')' << endl;

    return 0;
}
代码不错
phpskyking 2012-11-08
  • 打赏
  • 举报
回复
学习了!!!
Potter 2012-11-08
  • 打赏
  • 举报
回复
引用 12 楼 turingo 的回复:
给你一个二进制文件存取的例子,可以参考参考:
C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <string>#include <fstream>#include <iostream>using namespace st……

按你的意思做了,不过有点区别的是,我是采用的用java来进行写入文件,存储的数据...
解析文件:如下

然后解析代码:
ifstream file("pangpang.bin",ios::binary);
unsigned int m;
file.read((char*)&m,sizeof(unsigned int));
cout<<"m="<<m<<endl;
出现的问题如下:

其实我也就是去读取一个int值,然后还发现运行的结果确实一个很大的数:

这是为什么?
ww884203 2012-11-07
  • 打赏
  • 举报
回复
[quote=引用 7 楼 aa4790139 的回复:] 请问是否有控制读取的字节数?也就是说我知道存储数据的数据类型,然后根据他占用的数据类型字节数,然后来解析应该是可以的... [quote] fread就可以控制读取的字节数
ww884203 2012-11-07
  • 打赏
  • 举报
回复
如果你每次存储都是知道确切大小的话就用fread和fwrite就行了,根据大小次序一样也能一一对应。 如果你也不能肯定字符串有多长那就一次存都占一行,然后读的时候用fgets。 至于你说的没有设计好,我觉得各有利弊吧。C++就是明明白白告诉你,所有的数据对电脑来说没有种类的区别,都是二进制数据,只是看你怎么解释而已。JAVA封装了一些,容易使用但是没有让你对底层的实质有较好的体会。
Potter 2012-11-07
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
cin cin.getline ifstream ofstream 字符串流等. lz可以读一读<<C++ Primer>>流操作章节. 个人意见,供参考.
谢谢回复...我已经看了n篇文章了...C++ 中I/O这块个人觉得没有设计的好~
Potter 2012-11-07
  • 打赏
  • 举报
回复
引用 12 楼 turingo 的回复:
给你一个二进制文件存取的例子,可以参考参考: C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <string>#include <fstream>#include <iostream>using namespace st……
我先试试...
Potter 2012-11-07
  • 打赏
  • 举报
回复
引用 12 楼 turingo 的回复:
给你一个二进制文件存取的例子,可以参考参考: C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <string>#include <fstream>#include <iostream>using namespace st……
有点思路了....不愧是高手,非常感谢...
图灵狗 2012-11-07
  • 打赏
  • 举报
回复
给你一个二进制文件存取的例子,可以参考参考:

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

typedef struct
{
	int x;
	int y;
}point_t;

int main(int argc, char* argv[])
{
	/* 二进制文件的写入 */
	ofstream ofs("test.dat", ios::binary);
	/* 写入字符串 */
	string a = "You are welcome!"; 
	int n = a.size();
	ofs.write((char*)&n, sizeof(int));
	ofs.write(a.c_str(), sizeof(char) * n);
	/* 写入结构体 */
	point_t b = {80, 51};
	ofs.write((char*)&b, sizeof(point_t));
	ofs.close();	

	/* 二进制文件读取 */
	ifstream ifs("test.dat", std::ios::binary);
	/* 读取字符串 */
	int m;
	ifs.read((char*)&m, sizeof(int));
	char* c = new char[m + 1];
	ifs.read(c, sizeof(char) * m);
	c[m] = '\0';
	/* 读取结构体 */
	point_t d;
	ifs.read((char*)&d, sizeof(point_t));
	ifs.close();

	/* 显示读取数据 */
	cout << c << endl;
	cout << '(' << d.x << ',' << d.y << ')' << endl;

	return 0;
}
Potter 2012-11-07
  • 打赏
  • 举报
回复

引用 9 楼 turingo 的回复:
既然这样的话,那么可以把文件格式贴出来,具体问题具体分析,不然你也不太理解大家在讲什么。

引用 4 楼 aa4790139 的回复:引用 1 楼 JiMoKuangXiangQu 的回复:cin
cin.getline
ifstream
ofstream
字符串流等.

lz可以读一读<<C++ Primer>>流操作章节.

个人意见,供参考.
……

感谢回复:下面是我要解析的文件:

我用java最先存的一个int型的数据,占用两个字节,也就是读取我框出来的那块...里面混合了各种类型,这个读取循序和读取的数据类型,占用的字节数我知道...类似的怎么读取,才能解析出这个文件...请指教!感谢
Potter 2012-11-07
  • 打赏
  • 举报
回复
引用 5 楼 ww884203 的回复:
如果你每次存储都是知道确切大小的话就用fread和fwrite就行了,根据大小次序一样也能一一对应。 如果你也不能肯定字符串有多长那就一次存都占一行,然后读的时候用fgets。 至于你说的没有设计好,我觉得各有利弊吧。C++就是明明白白告诉你,所有的数据对电脑来说没有种类的区别,都是二进制数据,只是看你怎么解释而已。JAVA封装了一些,容易使用但是没有让你对底层的实质有较好的体会。
请问是否有控制读取的字节数?也就是说我知道存储数据的数据类型,然后根据他占用的数据类型字节数,然后来解析应该是可以的...
ri_aje 2012-11-07
  • 打赏
  • 举报
回复
c++ 不负责这个,可能有类库能满足你的需要,不过得自己找找,数据不是太复杂的话,自己写解析程序就行了。
mujiok2003 2012-11-07
  • 打赏
  • 举报
回复
用一种语言(比如java)写,用另一种语言(比如c/c++)读,这是完全没有问题的,TCP/IP通信就是如此。 读的一方需要知道怎么写入的,格式要统一(比如是二进制的还是文本的)。
图灵狗 2012-11-07
  • 打赏
  • 举报
回复
既然这样的话,那么可以把文件格式贴出来,具体问题具体分析,不然你也不太理解大家在讲什么。
引用 4 楼 aa4790139 的回复:
引用 1 楼 JiMoKuangXiangQu 的回复:cin cin.getline ifstream ofstream 字符串流等. lz可以读一读<<C++ Primer>>流操作章节. 个人意见,供参考. 谢谢回复...我已经看了n篇文章了...C++ 中I/O这块个人觉得没有设计的好~
Potter 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 wumn29 的回复:
#include "stdafx.h" #include <fstream> #include <string> using namespace std; void main(void) { ifstream ifstm("f:\\shif1.dat",ios::out|ios::binary);//打开配置文件 if(!ifstm){ exit(1); } ……
首先感谢你的回复...注意看清的题目,我的文本,全是16进制...而且里面混合了各种类型,比如:char,int,UTF,string 等等,就不能一味的按照你这种方式去读了...
wumn29 2012-11-06
  • 打赏
  • 举报
回复
#include "stdafx.h" #include <fstream> #include <string> using namespace std; void main(void) { ifstream ifstm("f:\\shif1.dat",ios::out|ios::binary);//打开配置文件 if(!ifstm){ exit(1); } vector<string> v;//用来存储从文件中读取的内容 string tmp; while(!ifstm.eof()) { ifstm>>tmp;//一行一行的读取 v.push_back(tmp); //将读取的信息存进vector里面 ,从尾部插入 } ifsrm.close(); //文件里面的信息读取在v里面, 要取内容操作v即可 }
加载更多回复(1)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧