我是科学家,不是程序员,请怜悯。
我想循环创建文件,在文件名中增加一个整数:
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());
// ...
}
我完全不知道你为什么要费心改变
char fn[] = "file00.txt";
排在第1位。
如果您尝试这样做,转换应考虑字符值,例如
fn[5] = i + '0';
// ^^^^^^
并且会给你带来更多复杂化,因为i
值大于9
.
另一种简单的方法,C 样式:
int i = 0; // ...
char fn[16];
sprintf(fn, "file%02d.txt", i);
你写的东西不会达到你的预期。您要将第 6 个字符(即第二个 0)更改为由数字表示的字符。看一下 ASCII 表,您会发现 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;
}
}
产出(有遗漏):
file00.txt
file01.txt
...
file09.txt
file10.txt
file11.txt
...
file98.txt
file99.txt
注意:to_string
需要 C++11。它在Windows上的一些g++版本上也被破坏了。这可以用itoa
来完成,但不太优雅。