2017-07-26 104 views
1

我有一個名爲「items.dat」的文件,它包含訂單itemID,itemPrice和itemName中的以下內容。C++:如何在使用getstream()和ifstream對象從文件中讀取一行時跳過第一個空格?

item0001 500.00 item1 name1 with spaces 
item0002 500.00 item2 name2 with spaces 
item0003 500.00 item3 name3 with spaces 

我寫了下面的代碼來讀取數據並將其存儲在結構中。

#include <fstream> 
#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <iomanip> 

using namespace std; 

struct item { 
    string name; 
    string code; 
    double price; 
}; 

item items[10]; 

void initializeItem(item tmpItem[], string dataFile); 

int main() { 

    initializeItem(items, "items.dat"); 
    cout << items[0].name << endl; 
    cout << items[0].name.at(1) << endl; 
    return 0; 
} 

void initializeItem(item tmpItem[], string dataFile) { 

    ifstream fileRead(dataFile); 

    if (!fileRead) { 
     cout << "ERROR: Could not read file " << dataFile << endl; 
    } 
    else { 
     int i = 0; 
     while (fileRead >> tmpItem[i].code) { 
      fileRead >> tmpItem[i].price; 
      getline(fileRead, tmpItem[i].name); 
      i++; 
     } 
    } 
} 

我看到什麼是函數getline()在開始讀取白色空間,而隨着內容一起閱讀項目名稱。

輸出

name1 with spaces 
n 

我想跳過開頭的空白。我怎樣才能做到這一點?

+1

爲什麼不在閱讀後修剪字符串而不是跳過空格? –

+0

但我們必須自己寫一個修剪功能,對吧? –

+0

是的,但它很容易,遍佈網絡的例子很多(包括這裏的很多例子)。 –

回答

3

std::ws IO操縱器可用於丟棄前導空格。

使用它緊湊的方法是:

getline(fileRead >> std::ws, tmpItem[i].name); 

這會放棄之前它傳遞給getlineifstream任何空白。

+0

這工作。順便說一句,這也是爲了追蹤空白空間嗎? –

+0

@AnjJo你在說你的'getline'電話嗎?不幸的是'getline'讀取整行,直到默認分隔符(換行符)或EOF。如果有尾隨空格,則需要修剪它們。 – Blastfurnace

+0

我如何使用std :: ws修剪尾部空白? –

相關問題