2013-12-21 79 views
0

比方說,我有名字,如一個文件:閱讀與引號和逗號的字符串的文件到字符串數組

"erica","bosley","bob","david","janice" 

也就是說,引號每個名稱,用逗號沒有空格分隔每個名稱在之間。

我想讀取這些字符串數組,但似乎無法找到忽略/ get/getline /任何組合工作。我想這是一個常見的問題,但我試圖在文件I/O方面做得更好,並且還不知道多少。下面是隻是在整個文件中讀取作爲一個字符串(不是我想要的,顯然)基本版本:

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

fstream iFile("names.txt", ios::in); 
string names[5]; 

int index = 0; 
while(iFile) 
{ 
    iFile >> names[index]; 
    index++; 
} 

for(int i = 0; i < 5; i++) 
{ 
    cout << "names[" << i << "]: " << names[i] << endl; 
} 

輸出:

names[0]: "erica","bosley","bob","david","janice" 
names[1]: 
names[2]: 
names[3]: 
names[4]: 

而且,我明白了爲什麼這一切又讀爲單個字符串,但爲什麼剩餘的元素沒有填充垃圾?

要清楚,我希望輸出的樣子:

names[0]: erica 
names[1]: bosley 
names[2]: bob 
names[3]: david 
names[4]: janice 
+1

'的std :: string'初始化的時候它沒有其他初始化一個空字符串。 –

+0

如果是我,我會將輸入放到一行中,然後編寫一個涉及'find_first_of'的循環來手動將行分開。但也許我是老學校? –

+0

引用的字符串可以逗號嗎?所引用的字符串是否有引號(通過某種轉義)? – RichardPlunkett

回答

6

處理最簡單的方法:

  1. 讀取整個文件,並將其放置到一個字符串,Here是如何做到這一點的例子。
  2. 拆分您從編號1獲得的字符串。Here是如何做到這一點的示例。
+0

哇,永遠不會猜到這是最好的方法。謝謝! – bcf

0

流提取按空格分隔。因此整個文件被讀爲一個字符串。你想要的是用逗號分割字符串。

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <sstream> 

fstream iFile("names.txt", ios::in); 
string file; 

iFile >> file; 

std::istringstream ss(file); 
std::string token; 

std::vector<std::string> names; 

while(std::getline(ss, token, ',')) { 
    names.push_back(token); 
} 

要刪除引號,使用此代碼:

for (unsigned int i = 0; i < names.size(); i++) { 
    auto it = std::remove_if(names[i].begin(), names[i].end(), [&] (char c) { return c == '"'; }); 
    names[i] = std::string(names[i].begin(), it); 
} 

remove_if返回end迭代器轉化的字符串,這就是爲什麼你構建新的字符串(s.begin(), it)

後輸出:

for (unsigned int i = 0; i < names.size(); i++) { 
    std::cout << "names["<<i<<"]: " << names[i] << std::endl; 
} 

Live Example