2013-03-06 38 views
6

Tôi đang sử dụng C++, nhưng Tôi quyết định phân tích cú pháp các dòng của tệp nhật ký với sscanf. Sau khi đọc từng dòng, nó sẽ trích xuất dữ liệu và lưu trữ chúng vào các biến.Đọc tên đầy đủ bằng sscanf

string test = "[06/03/2013 18:15:23] INFO - Open [Johny Cage]"; 

int day, month, year, second, minute, hour; 
char name[128]; 

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^\n]%c]", 
       &day, &month, &year, &second, &minute, &hour, name); 

if (c == 7) 
{ 
    cout << name << endl; 
} 

Tôi cần đọc tên như Johny Cage (Tên lẽ có không gian) và lưu nó để name, nhưng sản lượng là:

Johny Cage]

Vấn đề là đường nhỏ ]. Làm thế nào tôi có thể sử dụng sscanf mà nó không đọc ] cuối cùng?

+1

Sử dụng '[^]]' thay vì '[^ \ n]'. – jxh

+0

@ user315052: Không thành công, chương trình đã bị lỗi! – deepmax

+0

'name [strlen (name) - 1] = 0;' –

Trả lời

7

Sử dụng [^]] thay vì [^\n]. Ngoài ra, hãy xóa %c sau đó kết thúc chuỗi định dạng quét của bạn.

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]", 
       &day, &month, &year, &second, &minute, &year, name); 
3

Bằng cách kiểm tra chống lại nó. Hãy thử điều này:

] phải được thoát, nếu không nó sẽ được hiểu là 'kết thúc chuỗi phân cách', sau đó sẽ trống ... và do đó bất hợp pháp.

Với phần bổ sung này, nó sẽ dừng tại dấu ngắt dòng hoặc a], bất kỳ điều gì xảy ra trước.

Và tất nhiên xóa% c ... sau khi tất cả, bạn không lưu nó vào bất kỳ biến nào.

Lần bổ sung cuối cùng sẽ được đọc cho ký tự dòng mới tiếp theo mà nó tìm và loại bỏ bất kỳ dấu hiệu nào tìm thấy trên đường đi (do đó *).

+0

Nếu ']' là ký tự đầu tiên sau dấu ngoặc mở (hoặc dấu mũ trong trường hợp này), thì nó được bao gồm trong tập hợp và không cần phải được thoát. – mrh

+0

Nó chắc chắn không làm tổn thương để thoát khỏi nó mặc dù. –

1

Im không chắc chắn gì đang diễn ra với cách bạn phù hợp với tên, nhưng công trình này cho tôi:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"

này phù hợp với bất cứ điều gì ngoại trừ khung kết thúc.

+2

Vì bộ đệm 'tên' chỉ có thể chứa 128 ký tự, sử dụng'% 127 [^]] 'thay vào đó, nếu không bạn có nguy cơ bị tràn bộ đệm. –

+0

Điều đó sẽ hoạt động nhưng để lại dấu '] 'trong tệp đầu vào. Nó cần phải là '[% 127 [^]]]' để loại bỏ nó. – teppic

Các vấn đề liên quan