memcpy也不顶事吗?

rwjlqn 2010-01-20 05:42:55


#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
ifstream ifs;
ifs.open("haha.jpg", ios::out);
string str = "";
string connect = "";
while(!ifs.eof())
{
ifs>>str;
connect = connect + str;
}
ifs.close();
//cout<<"connect: " <<connect <<endl;
cout<<"length: "<<connect.length()<<endl;//length: 12345


char temp[1024*300] = {0};
//strncpy(temp, connect.c_str(), connect.length());
memcpy(temp, connect.c_str(), connect.length());

cout<<"length: "<<strlen(temp)<<endl;//temp里的数据为何不对头
//cout <<"temp: "<<temp <<endl; //为何打印不出来呢

}
...全文
380 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
kivenanlice 2010-01-23
  • 打赏
  • 举报
回复
这个不是memcpy的事,主要是因为string::c_str()函数转换时遇到“\0”就终止了,所以转换成char[]只有一部分。
那为什么cout<<content输出没问题呢?我想因为重载了“<<”操作符,可以对string进行处理。
你可以试试
cout<<content.c_str()<<endl;
结果也只显示一部分。
rwjlqn 2010-01-23
  • 打赏
  • 举报
回复
真不是个问题a~ 结贴~
mengde007 2010-01-22
  • 打赏
  • 举报
回复
能单步调试就调试吧;
不过我感觉你这个程序总体就不正确;文件里面的内容读取……
kim_jinye 2010-01-22
  • 打赏
  • 举报
回复
mark
rwjlqn 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 zhangyinze123 的回复:]
你那样打印只是打印2进制文件,不可能把图片输出。
[/Quote]
对 是打印二进制文件。 我把图片数据用二进制打印出来。。。。
connect能打印出全部的数据 为何temp却不能 为何????
zhangyinze123 2010-01-22
  • 打赏
  • 举报
回复
你那样打印只是打印2进制文件,不可能把图片输出。
rwjlqn 2010-01-22
  • 打赏
  • 举报
回复
自己顶一个~~~~~~~~~~~~~~~
IT_lau 2010-01-22
  • 打赏
  • 举报
回复
不知道~~
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 haozi8993 的回复:]
最好这样:
C/C++ codefor(int i=0;i<1024*300;i++) printf("%02X",temp[i]&0xff);
看看经过memcpy(temp, connect.c_str(), connect.length()); 之后temp里面都是些什么东西
[/Quote]

temp里的数据几乎跟connect里的数据一样~~~
wangbinykit 2010-01-21
  • 打赏
  • 举报
回复
在vs2008里调试了一下,connect 和temp里数据是一样的,但是temp只输出了temp【0】里的数据
罗耗子 2010-01-21
  • 打赏
  • 举报
回复
最好这样:
for(int i=0;i<1024*300;i++) printf("%02X ",temp[i]&0xff);

看看经过memcpy(temp, connect.c_str(), connect.length()); 之后temp里面都是些什么东西
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 haozi8993 的回复:]
能说说tmp里的数据有啥不对头吗?好像二进制的数据你应该用HEX的方式打印出来才行。
[/Quote]
cout < <"connect: " < <connect < <endl; //这个完全能打印出数据,应该说明connect里面没有\0的出现吧 否则就打印不出那么些数据了
cout < <"length: " < <connect.length() < <endl;//length: 12345


cout < <"length: " < <strlen(temp) < <endl;//temp里的数据一点点才4,5个字节
cout < <"temp: " < <temp < <endl; //如果用循环打印的话能打印出跟connect里面的一些数据,很明显是遇到\0打印终止了 可是为何会有\0了呢
罗耗子 2010-01-21
  • 打赏
  • 举报
回复
能说说tmp里的数据有啥不对头吗?好像二进制的数据你应该用HEX的方式打印出来才行。
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 adventurelw 的回复:]
还有,楼主没包含 <string>头文件也能用string?
[/Quote]
放心吧~
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
回复13楼的: 结果是一样不行~
回复15楼的: 绝对够大~
回复16楼的: ios.out和ios.in不碍事的
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zbwzll2 的回复:]
首先,我不知道你用的是什么编译器,
我用的是vc6,
我编译你的原始代码
但是这行
cout < <"connect: " < <connect < <endl;

cout < <"temp: " < <temp < <endl;
结果是一样的,
都是遇到空字符停止了,很短的几个字符
然后我循环打印就没问题了,两个都是一样的表现

你看你打印connect的时候有没有两个字符之间是空的
那个应该就是空字符了吧,
我觉得就是空字符的问题 \0

但是不知道你打印connect的时候为什么能无视空字符
库不一样?编译器不一样?标准不一样?
[/Quote]
这个真不知道~~
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
connect跟temp存储的内容一样 为何一个行一个不行?
rwjlqn 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 haozi8993 的回复:]
FFD8FFDB004300040202020202040202020404040404080604040404080806080E1
是从红色部分断了的不?
那里就是'\0'
[/Quote]

好像是 但是那个地方不应该是\0的 因为cout<<"connect: " <<connect <<endl;完全能打印出来如果有\0connect肯定打印不出的
zbwzll2 2010-01-21
  • 打赏
  • 举报
回复
00
zbwzll2 2010-01-21
  • 打赏
  • 举报
回复
你打印出的十六进制的0不就是空字符么
加载更多回复(30)

64,683

社区成员

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

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