2010-04-11 63 views
11
#include<string> 
... 
string in; 

//How do I store a string from stdin to in? 
// 
//gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to 
//char* gets (char*)' 
// 
//scanf("%s",in) also gives some weird error 

同樣,如何將in寫出到標準輸出或文件?如何讀寫STL C++字符串?

回答

21

您正試圖將C風格的I/O與C++類型混合使用。當使用C++時,你應該使用std :: cin和std :: cout流進行控制檯輸入和輸出。

#include<string> 
#include<iostream> 
... 
std::string in; 
std::string out("hello world"); 

std::cin >> in; 
std::cout << out; 

但是,當讀取一個字符串std :: cin只要遇到一個空格或新行就停止讀取。您可能希望使用getline從控制檯獲取整行輸入。

std::getline(std::cin, in); 

對文件使用相同的方法(處理非二進制數據時)。

std::ofstream ofs('myfile.txt'); 

ofs << myString; 
0

C++串必須被讀出和使用>><<運營商編寫和其他C++當量。但是,如果你想使用scanf函數在C,可以隨時讀取字符串的C++和使用方式的sscanf它:

std::string s; 
std::getline(cin, s); 
sscanf(s.c_str(), "%i%i%c", ...); 

輸出最簡單的方法的字符串是:

s = "string..."; 
cout << s; 

但printf的將工作太: [固定的printf]

printf("%s", s.c_str()); 

c_str()指針返回到空叔方法所有標準C函數都可以使用ASCII字符串。

+2

你用printf是不安全的,應該'的printf(「%S 「,s.c_str());'以防止緩衝區溢出。 – LiraNuna 2010-04-11 19:57:22

+0

你說得對,我會糾正它。 – 2010-04-11 21:55:20

3

有許多方法可以將stdin中的文本讀入std::string。關於std::string的一點是,它們根據需要增長,這又意味着它們重新分配。內部std::string有一個指向固定長度緩衝區的指針。當緩衝區已滿並且您請求向其添加一個或多個字符時,std::string對象將創建一個新的,較大的緩衝區而不是舊的緩衝區,並將所有文本移至新緩衝區。

這一切都是說,如果您知道預先要閱讀的文本的長度,那麼您可以通過避免這些重新分配來提高性能。

#include <iostream> 
#include <string> 
#include <streambuf> 
using namespace std; 

// ... 
    // if you don't know the length of string ahead of time: 
    string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // if you do know the length of string: 
    in.reserve(TEXT_LENGTH); 
    in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>()); 

    // alternatively (include <algorithm> for this): 
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(), 
     back_inserter(in)); 

以上所有將複製在標準輸入中找到的所有文本,直到文件結束。如果你只想要一個單一的線,使用std::getline()

#include <string> 
#include <iostream> 

// ... 
    string in; 
    while(getline(cin, in)) { 
     // ... 
    } 

如果你想要一個字符,使用std::istream::get()

#include <iostream> 

// ... 
    char ch; 
    while(cin.get(ch)) { 
     // ... 
    }