我必须逐个打开文件才能用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
可以将令牌转换为字符串 我试图在很多方面将它们结合起来但却失败了。 如何获得所需的结果,或者甚至可以用宏获得这样的结果?
答案 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 );
}