2011-09-01 23 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); 
}