c++将txt文件读入,存入动态数组,再输出时多了一个乱码

mail_hzp 2014-06-26 11:09:25
c++将txt文件读入,存入动态数组,再输出时多了一个乱码

程序如下


#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
ifstream in("char.txt");
in.seekg(0, ios::end); //设置文件指针到文件流的尾部
streampos ps = in.tellg(); //读取文件指针的位置
cout << "File size: " << ps << endl;
in.seekg(0);
char *ch;
ch=new char[ps];
for(int i=0;i<ps;i++)
{
in.get(ch[i]);
}
cout << ch<<endl;
delete[] ch;
in.close();
return 0;
}



结果如下


当把ps改成ps-1时却出现了问题,如下


#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
ifstream in("char.txt");
in.seekg(0, ios::end); //设置文件指针到文件流的尾部
streampos ps = in.tellg(); //读取文件指针的位置
cout << "File size: " << ps << endl;
in.seekg(0);
char *ch;
ch=new char[ps-1]; //这里改了
for(int i=0;i<ps;i++)
{
in.get(ch[i]);
}
cout << ch<<endl;
delete[] ch;
in.close();
return 0;
}


错误提示: error C2666: '-' : 3 overloads have similar conversions

求大神解释,,
...全文
311 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangen12345 2014-06-28
  • 打赏
  • 举报
回复
楼上说的很对,文件和字符串有一个 ' \0 ',要考虑到
我看你有戏 2014-06-28
  • 打赏
  • 举报
回复



#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
	ifstream in("char.txt");
	in.seekg(0, ios::end);      //设置文件指针到文件流的尾部
    streampos ps = in.tellg(); //读取文件指针的位置
    cout << "File size: " << ps << endl;
    in.seekg(0);
    char *ch;
	ch=new char[(int)ps+1];
    for(int i=0;i<ps;i++)
	{
		in.get(ch[i]);
	}
	ch[ps]=0;
    cout << ch<<endl;
    delete[] ch;
    in.close();
	return 0;
}


jamesguo37 2014-06-27
  • 打赏
  • 举报
回复
分配内存刚好保存数据,但是少了一个'\0',分配内存后,记得memset一下。不然会有乱码
hjl0508 2014-06-27
  • 打赏
  • 举报
回复
引用 3 楼 logiciel 的回复:
如下修改第一个程序中2行后不再多一个乱码:
  ch=new char[(int)ps+1]; //改 ch=new char[ps];
  for(int i=0;i<ps;i++)
  {
    in.get(ch[i]);
  } 
  ch[ps] = 0; //加 字符串结束符
  cout << ch<<endl;
+++ 时刻要记得在字符串数组最后加 '\0'
mujiok2003 2014-06-27
  • 打赏
  • 举报
回复
引用 3 楼 logiciel 的回复:
如下修改第一个程序中2行后不再多一个乱码:
  ch=new char[(int)ps+1]; //改 ch=new char[ps];
  for(int i=0;i<ps;i++)
  {
    in.get(ch[i]);
  } 
  ch[ps] = 0; //加 字符串结束符
  cout << ch<<endl;
++ 文件中, 没有文件字符串结束符('\0')
logiciel 2014-06-27
  • 打赏
  • 举报
回复
如下修改第一个程序中2行后不再多一个乱码:
  ch=new char[(int)ps+1]; //改 ch=new char[ps];
  for(int i=0;i<ps;i++)
  {
    in.get(ch[i]);
  } 
  ch[ps] = 0; //加 字符串结束符
  cout << ch<<endl;
williamwood 2014-06-27
  • 打赏
  • 举报
回复
overloads have similar conversions 是因为 in.get(ch[i]); 的[] 参数ps-1让编译器困惑 你应该显示的进行类型转换 比如 ch=new char[ (int)ps-1];
ningto.com 2014-06-26
  • 打赏
  • 举报
回复
memset(ch, 0, ps);

64,282

社区成员

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

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