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

发布于 2024-12-02 07:25:59 字数 440 浏览 0 评论 0原文

我必须一一打开文件才能用 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 是一个宏。 由于

#define APP(i) i

可以生成值,

#define APP(i) #i

因此可以将令牌转换为字符串。
我试图以多种方式将它们结合起来,但失败了。 如何获得所需的结果,或者是否有可能通过宏获得这样的结果?

I have to open files one by one for reading in C/C++. The name of the files are in0, in1, in2, in3.....
I tried to use preprocessor directive to create file names.
i want something like.

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

where APPEND is a MACRO.
Since

#define APP(i) i

can generate the value

#define APP(i) #i

can convert a token to string.
I am trying to combine them both in many ways but failed.
How to get the desired result or is it even possible to get the such a result with macro?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

诗化ㄋ丶相逢 2024-12-09 07:25:59

在您的情况下,变量 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);
}

希望有帮助。祝你好运!

In your case, the variable i is not a compile-time constant and so it is impossible to use pre-processor or template specialization because the value is simply not known at a time of compilation. What you can do is convert integer into string - boost.lexical_cast is one of the easiest to use solutions:

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

If you happen to have a compiler with C++11 support, you could use std::to_string(). For example:

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

Hope it helps. Good Luck!

说谎友 2024-12-09 07:25:59

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

#include <sstream>

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

Addendum to Vlad's answer -- if for some reason you're not able/willing to use Boost, you can accomplish what you want using standard C++ with the stringstream class:

#include <sstream>

void Foo() {
    for (int i = 0; i < n; ++i) {
        std::stringstream converter;
        converter << "/path/in" << i;
        open(converter.str());
    }
}
怎会甘心 2024-12-09 07:25:59

如果您不使用 boost,请尝试以下操作:

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

If you're not using boost, try this:

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

Use it this way:

for(int i=0;i<n;i++)
{
    string inp_file="/path/"+"in"+ StringUtils::toString(i);  //to generate /path/in1 etc
    open(inp_file);
}
迷你仙 2024-12-09 07:25:59

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

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

Just an addition to the existing answers which are all great, if you are using a newer compiler and standard library, c++11 introduces std::to_string(). So you can write code like this:

for(int i = 0; i < n; i++) {
    string inp_file = "/path/in"+ std::to_string(i);
    open(inp_file);
}
深空失忆 2024-12-09 07:25:59

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

The C solution is this :

#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 );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文