2016-06-10 150 views
-1

我是科學家,不是程序員,請仁慈。C++修改字符串以包含字符串repr。的整數

我想在一個循環中創建文件,在文件名遞增的整數

file01.txt 

file02.txt 
.... 

file10.txt 

。 。 。

我有兩個問題。 這是什麼,我已經試過了內核:

char fn[] = "file00.txt"; 
int i = 1; 
fn[5] = i; 

這將導致一個錯誤「預期的表達」 我雖然應該工作becauase「charcters是整數」

fn[5] = (char)i; 

導致同樣的錯誤。 我試過其他一些東西。之後,我必須弄清楚當我> 9和我有兩個數字時會發生什麼。迫切需要的建議。

(我花了小時試圖瞭解字符串,焦炭,陣列等正當我想我明白了,一個新的問題彈出。)

+0

你不能使用fn [5] =(char)我是因爲我可以大於9的數字。所以如果我20,你不能將它轉換爲字符 – kemis

+0

字符不是整數,它們是數字值一個字符在特定的編碼方案中,所以'char(0)'和'char('0')'之間有區別。如果你的char持有一個ASCII值,那麼值32代表空格(''''),值48代表'0'。你可以寫'fn [5] ='0'+ i',但是它只能涵蓋一個數字。 – kfsone

+1

錯誤消息聽起來像是一個編譯器錯誤,但是你沒有顯示整個事情,所以沒有辦法告訴。你在這裏展示的代碼不應該產生這樣的編譯錯誤。 –

回答

4

簡單的解決辦法是

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"; 

排名第一。

如果試圖這樣做,轉換應該採取字符值考慮像

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

,並會給你比9更大的i值的更多的併發症。

+1

修改該數組沒有未定義的行爲。 – Kevin

+1

如果您使用了'char * fn =「file00.txt」;'這將是未定義的行爲,但是當您聲明數組時它不是未定義的。 – Barmar

+0

@Barmar嗯,我看到了不同。 –

2

另一種簡單的,C風格:

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

有時舊的C方式是最好的,恕我直言。這比其他答案中的'stringstream'和字符串連接方式簡單得多。 – Barmar

+0

只要'我<10000000'就不成問題了,歡迎來到緩衝區溢出地!通過快速測試輕鬆解決問題,並且如果您生成了許多文件... Eeeeyipe! – user4581301

+0

@ user4581301有1000萬個文件的目錄?我認爲緩衝區溢出是他的問題中最少的。 – Barmar

1

你寫不會做你的期望是什麼。您正在將第六個字符(即第二個0)更改爲由數字表示的字符。看一下ASCII table,你會看到一個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來完成,但不夠優雅。

+0

使用std :: string是我的第一個想法,它很容易實現。但是我必須將它發送到一個正在查找char *的庫函數中,並且如果給它一個string.c_str(),它會生成一些不同的東西,顯然是這樣。 – garyp

+0

@garyp它試圖寫入它嗎? 'c_str()'是const char *,所以它不會匹配意圖寫入該值的函數,或者僅僅不允許const。你可以用'const_cast'來解決這個問題,但是使用它通常是一個壞主意。仍然可能更喜歡處理c字符串。 – 2016-06-11 01:33:19