2010-08-24 30 views
14

dữ liệu tôi đã được định dạng như sau:Làm thế nào để đọc dữ liệu được định dạng trong C++?

Words   5 
AnotherWord 4 
SomeWord  6

Đó là trong một tập tin văn bản và tôi đang sử dụng ifstream để đọc nó, nhưng làm thế nào để tách các số và chữ? Từ này sẽ chỉ bao gồm bảng chữ cái và sẽ có một số khoảng trống hoặc tab giữa từ và số, không chắc chắn bao nhiêu.

+0

Tôi không biết nếu nó là khoảng trắng hoặc tab giữa các từ và số lượng, sẽ không có chỗ trong vòng từ. – TheOnly92

+0

nếu định dạng tệp của bạn trở nên phức tạp hơn, bạn có thể muốn thử các cụm từ thông dụng cho mỗi dòng. Boost cung cấp một lib cho điều đó. –

Trả lời

19

Giả sử sẽ không có bất kỳ khoảng trắng trong "chữ" (sau đó nó sẽ không thực sự 1 từ), đây là một mẫu của cách đọc tối đa cuối của tập tin :

std::ifstream file("file.txt"); 
std::string str; 
int i; 

while(file >> str >> i) 
    std::cout << str << ' ' << i << std::endl; 
+0

Điều gì sẽ xảy ra nếu các tab tách biệt từ và số nguyên? – TheOnly92

+0

@ TheOnly92 nó chỉ hoạt động - dấu tách là khoảng trắng – Mark

+0

Tuyệt, đây là giải pháp tôi muốn. – TheOnly92

2

Nó thực sự rất dễ dàng, bạn có thể tìm thấy các tài liệu tham khảo here
Nếu bạn đang sử dụng các tab như delimiters, bạn có thể sử dụng getline thay vào đó và thiết lập các tham số dấu phân cách để '\ t'. Một ví dụ nữa sẽ là:

#include <vector> 
#include <fstream> 
#include <string> 

struct Line { 
    string text; 
    int number; 
}; 

int main(){ 
    std::ifstream is("myfile.txt"); 
    std::vector<Line> lines; 
    while (is){ 
     Line line; 
     std::getline(is, line.text, '\t'); 
     is >> line.number; 
     if (is){ 
      lines.push_back(line); 
     } 
    } 
    for (std::size_type i = 0 ; i < lines.size() ; ++i){ 
     std::cout << "Line " << i << " text: \"" << lines[i].text 
        << "\", number: " << lines[i].number << std::endl; 
    } 
} 
+1

Toán tử '>>' đọc 'std :: string'. – Donotalo

+0

@Donatalo: nếu bạn bao gồm có. Mặc dù, bạn cần phải bao gồm chuỗi nếu bạn muốn sử dụng getline là tốt, vì vậy bạn có một điểm hợp lệ :) Chỉnh sửa câu trả lời của tôi – Default

+0

Điều này thậm chí sẽ đọc chuỗi với whitespaces (khác với ''\ t'') trong đó. Tôi có một vài vấn đề với nó, mặc dù: 1. Bạn cần phải kiểm tra 'là' ngay lập tức trước khi đẩy lên vectơ. 2. Kiểm tra lỗi trước khi vòng lặp phải trả về 'int' (và không cần thiết). Giả sử bạn sẽ khắc phục những điều này, tôi đã bình chọn lên câu trả lời của bạn bất chấp câu trả lời đó. – sbi

4

Các >> nhà điều hành được ghi đè cho std::string và sử dụng khoảng trắng như một tách

nên

ifstream f("file.txt"); 

string str; 
int i; 
while (!f.eof()) 
{ 
    f >> str; 
    f >> i; 
    // do work 
} 
+0

Tôi đã thêm 'printf ("% s =% d \ n ", str.c_str(), i);' sau '// làm việc'. Nó in dòng cuối cùng ** hai lần **. Sử dụng MSVC9. –

+0

@AOI Karasu - có nó xin lỗi tôi chỉ nhận được đọc vào variabes làm việc – Mark

+0

sử dụng 'f' như là một điều kiện vòng lặp thay vì'! F.eof() ' – rubenvb

2

sscanf là tốt cho điều đó:

#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    char sentence []="Words   5"; 
    char str [100]; 
    int i; 

    sscanf (sentence,"%s %*s %d",str,&i); 
    printf ("%s -> %d\n",str,i); 

    return EXIT_SUCCESS; 
} 
Các vấn đề liên quan