2012-11-04 70 views
12

Tôi có fscanf để đọc các dòng cài đặt từ tệp cấu hình. Những thiết lập đã được xác định trước đúng định dạng trông giống nhưfscanf và ký tự dòng mới

name1=option1; 
name2=option2; 
... 

nên về cơ bản tôi làm

fscanf(configuration,"%[^=]=%[^;];",name,option); 

nơi cấu hình là các dòng tập tin và tên và lựa chọn được lập trình bộ đệm.

Vấn đề là bộ đệm tên chứa ký tự dòng mới mà tôi không muốn. Có specifier định dạng tôi đã bỏ lỡ trong "[^ ...]" thiết lập để bỏ qua ký tự newline? Dù sao, nó có thể được giải quyết thông qua định dạng specifier bao giờ?

BTW: Nuốt kí tự xuống dòng bằng writting này

"%[^=]=%[^;];\n" 

không elegent Tôi nghĩ cho rằng kí tự xuống dòng có thể lặp lại nhiều hơn một lần ở bất cứ đâu.

+1

Nếu trường 'nameN' không thể chứa khoảng trắng, chỉ cần thêm dấu cách vào trước chuỗi định dạng -' "% [^ =] =% [^;];" '- để bỏ qua khoảng trống phía trước. Nếu chúng có thể, bạn cần phải tiêu thụ dòng mới bằng 'getchar()'. –

+1

Câu trả lời được chấp nhận là đúng, dù sao, về các dòng mới lặp lại, bạn có thể sử dụng '% * [\ n]' để đọc một số tùy ý ''\ n'' mà không lưu trữ chúng. – effeffe

Trả lời

11

Chỉ cần thêm không gian ở phần cuối của chuỗi định dạng:

"%[^=]=%[^;]; " 

này sẽ ăn tất cả các ký tự khoảng trắng, bao gồm cả mới-dòng.

Báo giá từ cplusplus.com:

nhân vật Khoảng trắng: hàm sẽ đọc và bỏ qua bất kỳ ký tự khoảng trắng gặp phải trước khi nhân vật phi khoảng trắng tiếp theo (ký tự khoảng trắng bao gồm không gian, xuống dòng và ký tự tab - xem isspace). Một khoảng trống duy nhất trong chuỗi định dạng xác nhận bất kỳ số lượng ký tự khoảng trắng nào được trích xuất từ ​​luồng (bao gồm cả không có gì).

+0

Tuyệt vời. Cảm ơn. – Yang

1

này sẽ làm việc:

fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

Bạn sẽ phải tiêu thụ dòng character.Otherwise mới, xuống dòng còn lại trong dòng đầu vào.

+0

hmm ... vậy giả nên lớn như thế nào? Đủ lớn để nuốt tất cả các ký tự dòng mới có thể? – Yang

+0

Vì bạn đã nói rằng bạn có định dạng dữ liệu đầu vào được xác định trước nghiêm ngặt, bạn có thể tính toán số không. các ký tự chính xác cần thiết và tạo biến giả. Điều này sẽ giúp bạn tìm ra bất kỳ độ lệch nào có thể từ định dạng đầu vào, thay vì bỏ qua chúng (Điều này sẽ xảy ra nếu bạn sử dụng dấu cách, trước hoặc sau trong fscanf hoặc fgets). – askmish

+1

Có một '%' thiếu gần cuối, dù sao tại sao không sử dụng '% [^ =] =% [^;];% * [^ \ n]' và quên đi những dòng mới và bộ đệm để chứa chúng? – effeffe

6

Cách khác là sử dụng fgets() để đọc toàn bộ dòng vào chuỗi, sau đó sử dụng sscanf(). Điều này có một lợi thế trong gỡ lỗi trong đó bạn có thể thấy chính xác những gì dữ liệu chức năng đang làm việc trên.

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