【问题标题】:How to combine variable with string value如何将变量与字符串值结合起来
【发布时间】:2011-10-15 12:52:24
【问题描述】:

我想在(ofstream)文件路径中将变量与字符串值结合起来

示例:

long phNumber;
char bufPhNumber[20];
ofstream ifile;

cout << "Phone Number: ";
cin >> phNumber;
itoa(phNumber,bufPhNumber,20);

ifile.open("c://" + bufPhNumber + ".txt",ios::out);  // error in this line

如何将此变量 (bufPhNumber) 与该字符串 ("c://" + variable here + ".txt" ) 结合起来

【问题讨论】:

    标签: c++


    【解决方案1】:

    这样做:

    ifile.open((std::string("c://") + bufPhNumber + ".txt").c_str(),ios::out);  
    

    解释:

    它首先创建一个字符串,然后使用operator+() 连接其余的 c 字符串:

    std::string temp = std::string("c://") + bufPhNumber + ".txt";
    

    然后将c_str() 传递给.open()

    ifile.open(temp.c_str(),ios::out);  
    

    但是在C++11中,你不需要.c_str(),你可以直接使用std::string


    更好的解决方案应该是这样的:

    std::string phNumber; //declare it as std::string
    
    cout << "Phone Number: ";
    cin >> phNumber; //read as string
    
             //use constructor
    ofstream ifile(("c://" + phNumber + ".txt").c_str(), ios::out);  
    

    【讨论】:

    • 您更好的解决方案在ofstream ctor 中有错字。还是bufPHNumber
    • @Nawaz:感谢您的回答,但这不是我想要的,我想使用 int 值并转换为 char 然后在文件路径中使用它,我不想使用字符串类型而不是 int 类型或 long
    • @LionKing 无论如何,使用整数类型作为电话号码是个坏主意。前导 0s 或 +s 或 ` ` 分隔符或 - 分隔符怎么样。电话号码实际上只是一个标识符,为了人类方便,这些符号是十进制数字,而不是来自其他奇怪的字母。
    【解决方案2】:

    ofstream::open,至少在 C++11 (a) 之前,需要 const char * 作为文件名,而不是 std::string,根据 here

    代替:

    ifile.open("c://" + bufPhNumber + ".txt",ios::out);
    

    使用以下内容:

    string fspec = std::string ("c://") + bufPhNumber + ".txt";
    ifile.open (fspec.c_str(), ios::out);
    

    (您可能想考虑一下为什么您的输出文件被称为ifile)。


    (a) 在 C++11 中,有 两个 open 函数用于 basic_ofstream

    void open(const char* s, ios_base::openmode mode = ios_base::out);
    void open(const string& s, ios_base::openmode mode = ios_base::out);
    

    所以string 版本可以在那里工作。

    【讨论】:

    • @rubenvb:好点。我更新了答案以涵盖这一点。谢谢。
    • paxdiablo:一个提供如此多有用便利的新标准不应该被忽视:)
    【解决方案3】:

    好的,你好。您不能像在 java 中那样直接连接字符串,所以您的问题就在这里:

    bufPhNumber + ".txt"

    鉴于 bufPhNumber 是 char * 并且 text 是 char *,它们不支持您想要的 + 运算符。

    这样的工作有strcat(),但它假设目标字符串有足够的空间容纳目标字符串,它也会修改目标字符串。

    char Array[28]; //One for the null
    strcat(Array,"C:\\");
    strcat(Array,bufPhNumber);
    strcat(Array,".txt");
    

    虽然我建议对电话号码使用 char 数组,但 long 不太适合这种存储,因为它不能容纳您喜欢的尽可能多的数字(您可以考虑使用两个整数/长整数)。此外,请考虑使用 unsigned long (因为您不会得到负电话号码)。如果您确实使用 long/int,请注意从 long 到 char 数组以及从 char 数组到 long 的转换会占用大量内存和处理能力,在更大范围内,这比仅使用 char 数组效率低。

    【讨论】:

    • 错误答案。这是一个关于 C++ 而不是 C 的问题,您可以完美地连接 std::strings “就像在 Java 中一样”。你不能用普通的char指针来做到这一点。
    • @ChristianRau:我有正确的答案,因为字符串我指的是 char 字符串(注意复数)而不是 std::string (我总是用 std:: 来区分)。请注意短语Given bufPhNumber is a char * and text is a char *, they don't support the + operator他的代码中没有 std::strings 。请在上下文中表示(Java 使用 char 数组就像字符串一样操作,C++ 没有)。
    • 这个答案可能只被认为是正确的,因为它可以在 C++ 中工作,但它绝对是一个 C 答案(或者可能是一个 C/C++ 答案,这并不能让它变得更好)。在 C++ 中,char 数组用作 char 数组,但绝对不是字符串,无论 OP 可能使用什么奇怪的方言。您的回答只是走错了方向,向他解释了如何连接 char 数组,而不是如何将他的 char 数组转换为字符串。
    • 顺便说一句,我怀疑您是否可以在byte[] 数组上使用Java 的字符串函数,尽管我不得不承认我没有太多Java 经验。 String 不也是一个类吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2018-09-30
    • 2021-10-24
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多