【问题标题】:why write function don't work properly? [closed]为什么写函数不能正常工作? [关闭]
【发布时间】:2014-06-06 11:03:06
【问题描述】:

我写了这段代码。在这个程序中,我读取一个文件,然后将部分文件倒入 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"

【问题讨论】:

  • 使用strlen(temp),而不是sizeof(temp)
  • sizeof(temp) 为您提供指针变量的大小,对于您当前的环境(32 位),它实际上似乎是 4 个字节。
  • 使用 strlen 代替 sizeof 并且不要忘记在最后调用 flush 和 close 方法。
  • @SudhakarB: 无需显式刷新和关闭fstream;析构函数会解决这个问题。不过,您确实需要delete [] temp(或者,更好的是,改用 C++ 字符串)。
  • @MikeSeymour,是的,但这是一个很好的做法(看看这个stackoverflow.com/questions/5036878/…

标签: c++ file char


【解决方案1】:

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

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

更好的是,使用std::string 而不是所有这些奇怪的指针杂耍。这将修复代码中的内存泄漏和缓冲区溢出漏洞;可能还有一些不太明显的错误。很少有充分的理由将 C++ 写成 C 语言。

【讨论】:

  • 如果我使用字符串如何将其转换为 char*?因为我应该为 write 函数的第一个参数提供 char* 数据类型。
  • @user3703177:f.write(temp.c_str(), temp.size())f &lt;&lt; temp
【解决方案2】:

你可以使用strlen(temp)

sizeof(temp)

会给你指针的大小

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多