2015-04-21 57 views
-2

這是一個任務,我被困在第一個信息讀取過程中.. 我需要從文件「bank.txt」中讀取信息。 每個文件的行是這樣的: 大米(中國),13,2016-8-3,5kg如何跳過逗號讀取C++中的信息

我已經寫了CPP測試:

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

struct Food 
{ 
    string name; 
    int quantity; 
    string expireDate; 
    string unit; 
    bool selected; 
}; 

void all(Food item[]); 

int main() 
{ 
    ifstream infile; 
    Food bank[100]; 
    infile.open("bank.txt"); 

    string text, temp[400]; 
    string dummy; 
    int num; 
    stringstream linestream; 

    while(infile.good()) 
    { 
     for(int i = 0; i < 100; i++) 
     { 
      for(int j = 0; j < 4; j++) 
      { 
       getline(infile, text, ','); 
       temp[4 * i + j] = text; 
      } 

      istringstream(temp[4 * i + 1]) >> num; 
      bank[i].name = temp[4 * i]; 
      bank[i].quantity = num; 
      bank[i].expireDate = temp[4 * i + 2]; 
      bank[i].unit = temp[4 * i + 3]; 
     } 
    } 

    all(bank); 
    return 0; 
} 

void all(Food item[]) 
{ 
    for(int i = 0; i < 100; i++) 
     cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl; 
} 

但這運行到一些問題而奇數行只顯示名字。

如何修改我的代碼以使其正常運行?

+0

'bank.txt'的內容是什麼?什麼應該是輸出?你會得到什麼輸出? –

+0

請使用您的bank.txt內容來啓發我們,至少僞造相同格式的數據。 – Raistmaj

+0

@AntonSavin @Raistmaj他說的內容是「大米(中國),每條線13,2016-8-3,5kg'。對? –

回答

0

你也應該考慮到新線

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

struct Food 
{ 
    string name; 
    int quantity; 
    string expireDate; 
    string unit; 
    bool selected; 
}; 

void all(Food item[], int count); 

int main() 
{ 
    ifstream infile; 
    Food bank[100]; 
    infile.open("bank.txt"); 


    string text, temp[400]; 
    string dummy; 
    int num; 
    stringstream linestream; 

    int i = 0; 
    while (i < 100) 
    { 
     getline(infile, text, ','); 
     if (!infile.good()) { 
      break; 
     } 
     temp[4 * i] = text; 
     for (int j = 1; j<3; j++) 
     { 
      getline(infile, text, ','); 
      temp[4 * i + j] = text; 
     } 
     getline(infile, text, '\n'); 
     temp[4 * i + 3] = text; 

     istringstream(temp[4 * i + 1]) >> num; 
     bank[i].name = temp[4 * i]; 
     bank[i].quantity = num; 
     bank[i].expireDate = temp[4 * i + 2]; 
     bank[i].unit = temp[4 * i + 3]; 
     i++; 
    } 

    all(bank, i); 
    return 0; 
} 

void all(Food item[], int count) 
{ 
    for (int i = 0; i<count; i++) 
     cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl; 
} 
+0

信息顯示正確,thx。但之後有很多「340g..340..340g..340g」的生產線。不知道爲什麼.. – jyh0206

+0

@ jyh0206編輯了循環和結束條件 –

1

使用','getline的分隔符的離開換行的流。

取而代之的是,首先讀一整行,然後用stringstream構建它來提取零件。
(出於某種原因,你已經宣佈,這似乎是爲這個變量,但你永遠不使用它。)

string line; 
if (getline(infile, line)) 
{ 
    istringstream linestream(line); 
    for (int j=0;j<4;j++) 
    { 
     getline(linestream,text,','); 
     temp[4*i+j]=text; 
    } 
    //... 

也還有的while (infile.good())的問題,你不應該做的 - 你可能需要重組您的代碼。
this question and answers(這是關於eof,但關於「好」和「壞」流相同的原則在這裏持有)閱讀更多關於它。