2014-06-06 38 views
-1

我写了这段代码。在这个程序中,我读取了一个文件,然后将部分文件注入char * temp。最后在文件中写入char * temp。我遇到了一个问题。 当我在文件写入温度只有4个字符写入它,我该怎么办?为什么写功能无法正常工作?

fstream file; 
file.open("mary.txt",ios::in); 
file.seekg(-1,ios::end); 
int pos=file.tellg(); 
char ch; 
char c; 
int i=0; 
char * temp=new char[100]; 
file.seekg(0,ios::beg); 
while(pos >=0) 
{ 

    file.read(&ch,sizeof(char)); 
    if(ch=='a'||ch=='o'||ch=='u'||ch=='e'||ch=='i'||ch=='A'||ch=='O'||ch=='U'||ch=='E'||ch=='I') 
    { 
     pos--; 
     continue; 
    } 
    else if(ch>='a' && ch<='z') 
    { 
     c=ch-32; 
     temp[i]=c; 
     i++; 
    } 
    else 
    { 
     temp[i]=ch; 
     i++; 
    } 
    pos--; 
} 
temp[i]=NULL; 
cout<<temp<<endl; 
cout<<" sizeof temp:"<<sizeof(temp)<<endl;//out put is 4 while temp has longer size!! why? 
fstream f("test.txt",ios::trunc); 
f.write(temp,sizeof(temp));//if the file contains "abcdeifjle" only written "abcd" 
+1

使用'strlen(temp)',而不是'sizeof(temp)' –

+0

'sizeof(temp)'给出指针变量的大小,似乎是当前环境(32位)的4个字节。 –

+0

使用strlen而不是sizeof,也不要忘记在最后调用flush和close方法。 –

回答

0

可以使用strlen(temp)

sizeof(temp) 

会给你指针

的大小

指针一般具有固定的大小,为前。在32位可执行文件中,它们通常是32位的。有一些例外,比如在旧的16位窗口中,当你必须区分32位指针和16位时......假设它们将在现代桌面操作系统的给定可执行文件中保持一致是很安全的。

3

temp是一个指针; sizeof(temp)是指针的大小,它是32位平台上的4个字节。

要获得C风格字符串的长度,它指向,使用std::strlen(temp)

更妙的是,使用std::string而不是所有这种怪异的指针戏法。这将修复代码中的内存泄漏和缓冲区溢出漏洞;并可能有一些不太明显的错误。很少有很好的理由来编写C++,就好像它是C一样。

+0

如果我使用字符串如何将它转换为char *?因为我应该为写入函数的第一个参数提供char *数据类型。 – raha

+0

@ user3703177:'f.write(temp.c_str(),temp.size())'或'f << temp'。 –

相关问题