如何重写/覆盖文本文件中的字符串/行?

时间:2015-07-26 11:23:15

标签: c++

我是c ++的新手,我的程序的某个特定部分有问题。由于没有人真正帮助我,我敢在这里问。如果文本文件包含此行“hELp mE”,则应在同一文本文件中将其重写/覆盖为“HelP Me”。我所知道的是,我可能需要使用ofstream进行覆盖,但我对它应该如何完成感到非常困惑。我已经尝试了大约2个小时而且失败了。这是我完成的一半代码,只能从文件中读取。

 int main()
 {
   string sentence;
   ifstream firstfile;
   firstfile.open("alu.txt");
   while(getline(firstfile,sentence))
      {  
         cout<<sentence<<endl;
         for(int i=0;sentence[i] !='\0';i++)
           {
             if((sentence[i] >='a' && sentence[i] <='z') || (sentence[i] >='A' && sentence[i] <='Z'))
              {

                 if(isupper(sentence[i]))
                    sentence[i]=tolower(sentence[i]);
                 else if(islower(sentence[i]))
                    sentence[i]=toupper(sentence[i]);
              }
         }
      }


 return 0;
}

3 个答案:

答案 0 :(得分:1)

这很好用:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    string sentence;
    ifstream firstfile;
    firstfile.open("alu.txt");
    while(getline(firstfile,sentence))
    {
        cout<<sentence<<endl;
        for(int i=0; sentence[i] !='\0'; i++)
        {
            if((sentence[i] >='a' && sentence[i] <='z') || (sentence[i] >='A' && sentence[i] <='Z'))
            {

                if(isupper(sentence[i]))
                    sentence[i]=tolower(sentence[i]);
                else if(islower(sentence[i]))
                    sentence[i]=toupper(sentence[i]);
            }
        }
    }
    firstfile.close();
    cout<<sentence<<endl;
    ofstream myfile;
    myfile.open ("alu.txt");
    myfile<<sentence;
    myfile.close();

    return 0;
}

根据您的代码,我只需close()您的阅读模式并打开open()模式&amp;拿sentence

此链接可能对您有所帮助Input/output with files in C++

答案 1 :(得分:0)

按照@πάνταῥεῖ解决方案,您可以使用ifstream读取特定文件中的内容,然后判断并更改每个字符的UPPER / lower。最后,使用ofstream覆盖原始文件。

希望是有帮助的。

答案 2 :(得分:0)

您可以使用fstream在C ++中进行就地重写。这将逐字符替换所有小写字母,反之亦然。

#include <iostream>
#include <fstream>
#include <locale>

int main()
{
  std::locale loc;
  std::fstream s("a.txt");
  char next;
  int pos = 0;
  while((next = s.peek()) != EOF) {
    if(islower(next,loc))
      next = toupper(next,loc);
    else if(isupper(next,loc))
      next = tolower(next,loc);
    s.seekp(pos);
    s.write(&next,1);
    pos++;
  }
  return 0;
}