用于创建文件名的预处理程序指令

时间:2011-09-01 18:44:51

标签: c++ c c-preprocessor

我必须逐个打开文件才能用C / C ++阅读。文件的名称是in0,in1,in2,in3 ..... 我试图使用预处理器指令来创建文件名。 我想要类似的东西。

for(int i=0;i<n;i++)
{
    string inp_file="/path/"+"in"+APPEND(i);  //to generate /path/in1 etc
    open(inp_file);
}

其中APPEND是MACRO。 由于

#define APP(i) i

可以生成值

#define APP(i) #i

可以将令牌转换为字符串 我试图在很多方面将它们结合起来但却失败了。 如何获得所需的结果,或者甚至可以用宏获得这样的结果?

5 个答案:

答案 0 :(得分:10)

在您的情况下,变量i不是编译时常量,因此不可能使用预处理器或模板特化,因为在编译时根本不知道该值。你可以做的是将整数转换为字符串 - boost.lexical_cast是最容易使用的解决方案之一:

for (int i = 0; i < n; ++i) {
    // Generate /path/in1 etc
    std::string inp_file = "/path/in"+ boost::lexical_cast<std::string>(i);
    open(inp_file);
}

如果您碰巧拥有支持C ++ 11的编译器,则可以使用std::to_string()。例如:

for (int i = 0; i < n; ++i) {
    // Generate /path/in1 etc
    std::string inp_file = "/path/in" + std::to_string(i);
    open(inp_file);
}

希望它有所帮助。祝你好运!

答案 1 :(得分:7)

Vlad回答的附录 - 如果由于某种原因你不能/不愿意使用Boost,你可以使用stringstream类的标准C ++来完成你想要的任务:

#include <sstream>

void Foo() {
    for (int i = 0; i < n; ++i) {
        std::stringstream converter;
        converter << "/path/in" << i;
        open(converter.str());
    }
}

答案 2 :(得分:4)

如果您没有使用提升,请尝试以下方法:

namespace StringUtils
{
    // Converts any type which implements << to string (basic types are alright!)
    template<typename T>
    std::string StringUtils::toString(const T &t)
    {
       std::ostringstream oss;
       oss << t;
       return oss.str();
    }
}

以这种方式使用:

for(int i=0;i<n;i++)
{
    string inp_file="/path/"+"in"+ StringUtils::toString(i);  //to generate /path/in1 etc
    open(inp_file);
}

答案 3 :(得分:1)

只是对现有答案的补充,如果你使用的是较新的编译器和标准库,c ++ 11引入了std::to_string()。所以你可以写这样的代码:

for(int i = 0; i < n; i++) {
    string inp_file = "/path/in"+ std::to_string(i);
    open(inp_file);
}

答案 4 :(得分:1)

C解决方案是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  int n =4;
  char nstr[12];
  sprintf(nstr, "%d", n);
  int nlen = strlen( nstr );


  const char *fd = "/path/in";
  char buff[ strlen(fd) + nlen + 1 ];

  sprintf( buff, "%s%d", fd, n );

  /* for testing */
  printf( "%s\n", buff );
}