C++修改一个字符串来包含字符串RPR。整数的

C++修改一个字符串来包含字符串RPR。整数的,c++,arrays,string,C++,Arrays,String,我是科学家,不是程序员,请发发发慈悲吧 我想在循环中创建文件,在文件名中增加一个整数: file01.txt file02.txt .... file10.txt 。 . 我有两个问题。 这是我尝试的核心: char fn[] = "file00.txt"; int i = 1; fn[5] = i; 这将导致预期表达式出现错误 我想这应该行得通,因为字符是整数 fn[5] = (char)i; 结果是相同的错误。 我还试过其他一些方法。在那之后,我必须弄清楚当I>9并且我有两个数字

我是科学家,不是程序员,请发发发慈悲吧

我想在循环中创建文件,在文件名中增加一个整数:

file01.txt

file02.txt
....

file10.txt
。 .

我有两个问题。 这是我尝试的核心:

char fn[] = "file00.txt";
int i = 1;
fn[5] = i;
这将导致预期表达式出现错误 我想这应该行得通,因为字符是整数

fn[5] = (char)i;
结果是相同的错误。 我还试过其他一些方法。在那之后,我必须弄清楚当I>9并且我有两个数字时会发生什么。迫切需要的建议

我花了几个小时试图理解字符串、字符、数组等。就在我认为我理解的时候,一个新问题突然出现了。

简单的解决方案是

for(int file_index = 0; file_index < max_file_index; ++file_index) {
    // Render your file name:
    std::ostringstream file_name;
    file_name << "file" << std::setw(2) << std::setfill('0') << file_index << ".txt";
    // Create the file using file_name.str() 
    // (or file_name.str().c_str() for pre c++11 standards)
    std::ofstream outfile(file_name.str());
    // ...
} 
排在第一位

如果您尝试这样做,转换应该考虑字符值,如

fn[5] = i + '0';
       // ^^^^^^

对于i大于9的值,会给您带来更多的复杂性。

另一种简单的方法,C风格:

int i = 0; // ...
char fn[16];
sprintf(fn, "file%02d.txt", i);

你所写的不会达到你的期望。您正在将第六个字符(第二个0)更改为数字表示的字符。看一看,您会发现0整数与“0”字符不对应;事实上,它将对应一个空字符,用于指示C样式字符串中字符串的结尾

即使将整数值转换为正确的ASCII值,也只会修改第二个零。因此,10将导致file0:.txt而不是file10.txt.:9点以后

我强烈建议不要用C的方式来做这件事,你正试图这样做。为了安全和简单,请使用std::string

#include <iostream>
#include <string>

int main( )
{
    std::string name = "file";
    std::string extension = ".txt";
    for( int i = 0; i < 100; ++i )
    {
        std::string fullName;

        if( i < 10 )
           fullName = name + '0' + std::to_string( i ) + extension;
        else
           fullName = name + std::to_string( i ) + extension;

        std::cout << fullName << std::endl;
    }
}

注意:需要C++11。它在Windows上的一些g++构建中也被破坏。这可以用,但不太优雅。

不能使用fn[5]=char i,因为我可以使用大于9的数字。如果我是20,你不能把它转换成字符字符不是整数,它们是数值,代表一个特殊的编码方案中的字符,所以字符0和字符“0”之间有区别。如果您的字符包含ASCII值,则值32表示空格“”,值48表示“0”。您可以编写fn[5]=“0”+i,但这只包含一个数字。错误消息听起来像是编译器错误,但您没有显示全部内容,因此无法判断。此处显示的代码不应该生成这样的编译错误。是否必须有前导零,或者file1.txt是否可以接受?修改该数组没有未定义的行为。如果执行char*fn=file00.txt;,则将是未定义的行为;,但是当你声明一个数组时,它不是未定义的。@Barmar啊,我看到了区别。有时候旧的C方法是最好的,IMHO。这比其他答案中的stringstream和string连接方式简单得多。只要我<10000000,就没有问题。在那之后,欢迎来到缓冲区溢出区!通过快速测试很容易解决,如果您生成了那么多文件。。。哎哟,哎哟@user4581301一个包含1000万个文件的目录?我认为缓冲区溢出是他最不关心的问题。有了你,@Barmar,但以前有点这样做过。这些文件在消费后被删除,但数量一直在上升,几周后,就被删除了。最好做这个测试。@user4581301:如果OP在问题中写了file000000000.txt,我可能会努力增加缓冲区大小并进行测试。使用std::string是我的第一个想法,而且很容易实现。但我必须将它发送到一个正在寻找char*的库函数中,如果给它string.c_str,它就会发出barfs,这显然会产生一些不同的结果。@garyp它是在试图写入它吗?c_str是const char*,因此它既不匹配打算写入值的函数,也不匹配不允许使用const的函数。您可能可以通过const_cast绕过这个问题,但使用它通常是个坏主意。仍然可能比处理c字符串更好。
#include <iostream>
#include <string>

int main( )
{
    std::string name = "file";
    std::string extension = ".txt";
    for( int i = 0; i < 100; ++i )
    {
        std::string fullName;

        if( i < 10 )
           fullName = name + '0' + std::to_string( i ) + extension;
        else
           fullName = name + std::to_string( i ) + extension;

        std::cout << fullName << std::endl;
    }
}
file00.txt
file01.txt
...
file09.txt
file10.txt
file11.txt
...
file98.txt
file99.txt