2011-12-07 45 views
14

Làm cách nào để đọc nổi từ tệp .txt. Tùy thuộc vào tên ở đầu mỗi dòng tôi muốn đọc một số tọa độ khác nhau. Các phao được phân cách bởi "không gian".Đọc nổi từ tệp .txt

Ví dụ: triangle 1.2 -2.4 3.0

Kết quả sẽ là: float x = 1.2/float y = -2.4/float z = 3.0

Các tập tin có nhiều dòng với differens hình dạng mà có thể phức tạp hơn, nhưng tôi nghĩ rằng nếu tôi biết làm thế nào để làm một trong số họ tôi có thể làm những người khác một mình.

My Mã cho đến nay:

#include <iostream> 

#include <fstream> 

using namespace std; 

int main(void) 

{ 

    ifstream source;     // build a read-Stream 

    source.open("text.txt", ios_base::in); // open data 

    if (!source) {      // if it does not work 
     cerr << "Can't open Data!\n"; 
    } 
    else {        // if it worked 
     char c; 
     source.get(c);     // get first character 

     if(c == 't'){     // if c is 't' read in 3 floats 
      float x; 
      float y; 
      float z; 
      while(c != ' '){   // go to the next space 
      source.get(c); 
      } 
      //TO DO ??????    // but now I don't know how to read the floats   
     } 
     else if(c == 'r'){    // only two floats needed 
      float x; 
      float y; 
      while(c != ' '){   // go to the next space 
      source.get(c); 
      } 
      //TO DO ?????? 
     }         
     else if(c == 'p'){    // only one float needed 
      float x; 
      while(c != ' '){   // go to the next space 
      source.get(c); 
      } 
      //TODO ??????? 
     } 
     else{ 
      cerr << "Unknown shape!\n"; 
     } 
    } 
return 0; 
} 
+0

Có bạn đã thử [sscanf()] (http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/)? – jedwards

+0

Ngoài ra, một vài dòng từ tệp văn bản của bạn có thể giúp xác thực bất kỳ mã nào mà mọi người đề xuất. – jedwards

+0

@jedwards Xét rằng đó là C++, 'sscanf' sẽ không tốt hơn nhiều so với rác 'getc' này. –

Trả lời

22

Tại sao không chỉ sử dụng C++ suối theo cách thông thường thay vì tất cả getc điên rồ này:

#include <sstream> 
#include <string> 

for(std::string line; std::getline(source, line);) //read stream line by line 
{ 
    std::istringstream in(line);  //make a stream for the line itself 

    std::string type; 
    in >> type;     //and read the first whitespace-separated token 

    if(type == "triangle")  //and check its value 
    { 
     float x, y, z; 
     in >> x >> y >> z;  //now read the whitespace-separated floats 
    } 
    else if(...) 
     ... 
    else 
     ... 
} 
+2

Hoàn hảo, cảm ơn rất nhiều !!! Điều đó đã cứu tôi rất nhiều công việc, tôi vẫn còn mới với C++: D – user1053864

5

này nên làm việc:

string shapeName; 
source >> shapeName; 
if (shapeName[0] == 't') { 
    float a,b,c; 
    source >> a; 
    source >> b; 
    source >> c; 
} 
Các vấn đề liên quan