2013-05-15 74 views
0

我很驚訝,在C++中沒有內置的方法來投射字符串和字符。這是我的問題:我要更新一個文本文件,這樣一行:字符串和字符不兼容

#include <stdlib.h> 
#include <fstream> 
#include <windows.h> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main(void) { 

    char l1 [12]; 
    char l2 [15]; 
    char l3 [15]; 
    char l4 [15]; 
    char md [16]; 

    FILE * myfile2 = fopen("state.txt", "r+"); 
    fgets(l1,12,myfile2); 
    fgets(l2,12,myfile2); 
    fgets(l3,12,myfile2); 
    fgets(l4,12,myfile2); 
    fseek (myfile2 , 0 , SEEK_SET); 

    strcpy(md , "detectoroff"); 
    fputs (md,myfile2); 

    strcpy(md,l2); 
    fputs (md,myfile2); 
    strcpy(md,l3); 
    fputs (md,myfile2); 
    strcpy(md,l4); 
    fputs (md,myfile2); 
    Sleep(1000); 
    fclose(myfile2); 
    return EXIT_SUCCESS; 
} 

Inicially文本文件具有

a 
    b 
    c 
    d 

時運行的代碼的輸出是

detectoroffb 
    c 
    d 

和如果我更換線

strcpy(md , "detectoroff"); 

這個

strcpy(md , "detectoroff\n"); 

現在的結果是正確的,但如果我運行此兩次,將出現一個空行下的第一個,另一個,如果是跑三圈等我怎樣才能解決這個問題?

+5

無關使用C++和C++ 11(刪除此標記)。這個代碼是純粹的C,除了無用的C++包含。 –

+4

這與鑄造字符串和字符有什麼關係?它與'std :: string'有什麼關係? – Barmar

+0

也許我應該使用「轉換」而不是「轉換」這個詞,將字符串轉換爲字符是我進一步需要的。 – JoeCoolman

回答

0

不要害怕使用幾千字節。

#include <cstdlib> 
#include <cstdio> 
int main(void) { 
    using namespace std; 
    static const int BUFFERSIZE = 4096; 
    char line_1[BUFFERSIZE]; 
    char line_2[BUFFERSIZE]; 
    char line_3[BUFFERSIZE]; 
    char line_4[BUFFERSIZE]; 
    char md [] = "detectoroff\n"; 

    FILE * myfile2 = fopen("state.txt", "r+"); 

    fgets(line_1, BUFFERSIZE, myfile2); 
    fgets(line_2, BUFFERSIZE, myfile2); 
    fgets(line_3, BUFFERSIZE, myfile2); 
    fgets(line_4, BUFFERSIZE, myfile2); 

    fseek(myfile2, 0, SEEK_SET); 

    fputs(md, myfile2); 
    fputs(line_2, myfile2); 
    fputs(line_3, myfile2); 
    fputs(line_4, myfile2); 

    fclose(myfile2); 
    return EXIT_SUCCESS; 
} 

更妙的是用C編寫這個程序,而不是++與C風格的:

#include <fstream> 
#include <string> 
int main(void) { 
    using namespace std; 
    string line_1, line_2, line_3, line_4; 
    string md("detectoroff"); 
    fstream myfile2("state.txt", fstream::in|fstream::out); 

    getline(myfile2, line_1); 
    getline(myfile2, line_2); 
    getline(myfile2, line_3); 
    getline(myfile2, line_4); 

    myfile2.clear(); 
    myfile2.seekg(0, ios::beg); 

    myfile2 
    << md << '\n' 
    << line_2 << '\n' 
    << line_3 << '\n' 
    << line_4 << '\n'; 
    myfile2.close(); 
    return 0; 
} 
+0

這工作得很好@Hal Canary!,與千字節沒有問題,但爲什麼要定義line_1,2,3,4的長度過長呢?謝謝。 – JoeCoolman

3

變化l1的聲明:

char l1 [13]; 

detectoroff是11個字符。您需要另一個字符作爲換行符,另一個字符表示字符串結尾的空字節,總共爲13個字符。由於您只聲明l1有12個字符,因此fgets()正在寫入數組邊界之外。這導致未定義的行爲。

使用std::string和C++流方法,你不會遇到這樣的問題。

+0

未經測試的樣本:http://ideone.com/s7CpX8 –

+0

對於Sleep()的抱歉,我沒有將它從原始代碼中刪除。 – JoeCoolman

+0

我沒有對Sleep()做任何說明,這是Mooing Duck樣本中的一條評論。 – Barmar