使用for循环的计数器作为条件

时间:2014-12-19 11:46:30

标签: c++ if-statement for-loop optimization

我正在用C ++创建一个程序,它接受pdf并将其转换为epub。我的功能有问题,读取章节并为每章创建不同的文件。输入文件将如下所示:

  

第1章

     
    blah blah blah ..... blah

  
     

第2章

     
    blah blah blah ..... blah

  

我正在尝试使用for循环检查字符串的开头,如果是,则在正确的目录中创建一个名为“chapter#.xhtml”的xhtml文件。我遇到的问题是检查文本并创建相应的文件。

for(int i=1;i<chapters;i++){
  char j = i;
  string chap = "book/OEBPS/chapters/chapter";
  chap.append(1,j).append(".xhtml");
  if(line == "Chapter "+j){
    out << "</div>\n</body>\n</html>";
    out.close();
    out.open(chap.c_str());
    break;
  }
}

基本上我正在尝试创建一个计数器,该计数器既可以是字符串,也可以添加到字符串中以在if语句条件和out.open参数中使用。 以下是整个功能以防万一。

void readChapters(ofstream& out,int chapters){
  string line,file;
  char letter;
  ifstream in;
  cout << "Enter input file\n";
  cin >> file;
  in.open(file.c_str());
  out.open("junk");
  getline(in,line);
  while(in) {
    for(int i=1;i<chapters;i++){
      char j = i;
      string chap = "book/OEBPS/chapters/chapter";
      chap.append(1,j).append(".xhtml");
      if(line == "Chapter "+j){
        out << "</div>\n</body>\n</html>";
        out.close();
        out.open(chap.c_str());
        break;
      }
    }
    getline(in,line);
    if(line == "\n")
      getline(in,line);
    out << line <<  "\n</p>\n<p>\n";
  }
  out << "</div>\n</body>\n</html>";
  out.close();
  remove("junk");
}

2 个答案:

答案 0 :(得分:1)

此行不符合您的要求:

char j = i;

至多,完全可怕:

char j = '0' + i;

但我建议你使用ostringstream:

std::ostringstream ostr;
ostr << "Chapter " << i;
std::string chap = ostr.str();

注:

for(int i=1;i<chapters;i++)

可是:

for(int i=1;i<=chapters;i++)
              ^
              |

答案 1 :(得分:1)

if(line == "Chapter "+j){

"Chapter "是一个字符串文字,而不是std::string,因此"Chapter "+j会将j添加到指向const char*的{​​{1}}指针。例如,如果"Chapter ",则添加结果为j == 1。您应该明确地将其转换为"hapter ",以及std::string

j

在C ++ 14中,您可以使用if (line == std::string("Chapter ") + std::to_string(j)) { 文字:

std::string