2011-09-01 54 views
2

我必须逐一打开文件以便在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 

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

+1

预处理器不能单独用来实现任何运行时功能。单独使用宏来获得这样的结果是不可能的。你所能做的只是将一些到字符串的转换函数包装到一个宏中,但这样做没什么意义。 – AnT

回答

7

补遗弗拉德的答案 - 如果由于某种原因你不能/愿意使用Boost,你可以完成你想要使用标准的C++与stringstream类的内容:

#include <sstream> 

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

+1非增强型解决方案。 – 2011-09-01 18:53:34

+0

Vlad Lazarenko答案中的ups数量反映了相当标准的提升。但我的事情,我会接受这个答案,因为我不需要更新我的任何图书馆(懒我!!)谢谢! – Terminal

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); 
} 

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

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); 
} 
+0

这几乎是Boost所做的。 +1 – 2011-09-01 18:52:54

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); 
} 
1

该℃溶液来是这样的:

#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); 
}