2010-04-27 80 views
6

Tôi đang cố gắng đọc tệp phân tách trả lại. đầy đủ các cụm từ.cách đọc chuỗi từ n tệp phân tách

Tôi đang cố gắng đặt từng cụm từ vào một chuỗi.

Vấn đề là khi tôi cố gắng để đọc các tập tin với

fscanf(file,"%50s\n",string); 

chuỗi chỉ chứa một từ. khi nó va chạm với một khoảng trắng, nó dừng đọc chuỗi

Trả lời

2

fscanf có thể được sửa đổi để đọc không gian trong quá khứ. Các chi tiết có một chút phức tạp. Dưới đây là những gì các trang người đàn ông nói về% [...]

Trận một chuỗi rỗng của ký tự từ tập theo quy định của ký tự chấp nhận; con trỏ tiếp theo phải là con trỏ đến char và có phải đủ chỗ cho tất cả các ký tự trong chuỗi, cộng với một ký tự NUL kết thúc. Việc bỏ qua không gian trắng hàng đầu thông thường là bị chặn. Chuỗi này phải được tạo thành lên của các diễn viên char trong (hoặc không có) một số cụ thể; tập hợp được xác định bởi các ký tự giữa ký tự mở [ký tự và ký tự đóng ]. Tập hợp không bao gồm các ký tự đó nếu ký tự đầu tiên sau khung mở là dấu mũ. ^. Để bao gồm khung đóng trong bộ này, hãy đặt ký tự đầu tiên là sau dấu ngoặc mở hoặc dấu mũ; bất kỳ vị trí nào khác sẽ kết thúc bộ này. Dấu gạch ngang ký tự - cũng đặc biệt; khi đặt giữa hai ký tự khác, nó thêm tất cả các ký tự can thiệp vào bộ này. Để bao gồm dấu gạch nối, hãy đặt dấu gạch ngang ký tự cuối cùng trước dấu ngoặc đơn cuối cùng . Ví dụ: `[^] 0-9-] 'nghĩa là tập hợp` `mọi thứ ngoại trừ khung đóng, không qua chín và dấu gạch nối' '.Chuỗi kết thúc với sự xuất hiện của một ký tự không phải là trong (hoặc, với dấu mũ, trong) đặt hoặc khi độ rộng trường hết.

Vì vậy,% [^ \ n] nên đọc mọi thứ cho tới khi trở về vận chuyển.

+2

Nó đọc tất cả mọi thứ lên đến dòng mới nhưng * không * dòng mới chính nó. Nếu bạn lặp lại 'fscanf (file,"% [^ \ n] ")', bạn sẽ tiếp tục nhận được chuỗi rỗng nhiều lần. Bạn cần tiêu thụ dòng mới bằng khoảng trắng trong chuỗi định dạng hoặc một cái gì đó như '% * c'. –

+0

Cảm ơn điều này là nó. –

+0

@Adam Điểm tốt. Câu trả lời được chấp nhận ở trên cũng an toàn hơn cho các lỗi tràn bộ đệm. –

3

fscanf khi đọc không tìm thấy khoảng trắng.

Vì bạn đang đọc văn bản chưa định dạng, bạn chỉ có thể sử dụng fgets, mà đọc cho đến khi nó lấp đầy bộ đệm bạn cho nó, nó tìm thấy một dòng mới (\n), hoặc nó đạt đến end-of-file, tùy theo cái nào đến trước.

+0

Điều này hoạt động kỳ lạ. nó không đọc mọi dòng. và mỗi chuỗi thay vì kết thúc bằng \ 0 kết thúc bằng \ n –

+1

Mỗi chuỗi vẫn kết thúc bằng ''\ 0'', nhưng ký tự cuối cùng trước đó thường là'' \ n'', vì nó đọc trong dòng chính xác như nó xuất hiện trong tệp. Nếu ''\ n'' vắng mặt thì nó có nghĩa là bộ đệm của bạn không đủ lớn cho toàn bộ dòng, hoặc bạn chỉ đọc các ký tự cuối cùng trong tệp và nó không kết thúc bằng một dòng mới. – caf

5
fscanf(file,"%50[^\n]\n",string); 
  1. Mỗi nhân vật ngoại trừ \n sẽ được tiêu thụ bởi [^\n]

  2. tối đa 0f 50 ký tự sẽ được tiêu thụ (đảm bảo chuỗi có không gian cho 51 ít nhất)

  3. ..\n",string điều này đảm bảo rằng \n cũng được sử dụng để xt gọi không chỉ trả về một chuỗi rỗng.

+0

công trình này tuyệt vời, Cảm ơn –

2

Avoid using scanf. Như đã đề cập, bạn nên sử dụng fgets để thay thế.

Nếu bạn không muốn sử dụng bộ đệm có kích thước cố định và để cho phép các dòng có độ dài tùy ý, bạn có thể thử sử dụng Chuck Falconer's public domain ggets function. (Liên kết đó có vẻ là xuống ngay bây giờ, nhưng archive.org has a copy.)

+0

@ Zenikoder: Wow, bạn đã gặp rắc rối khi downvote bất kỳ bài viết nào đề cập đến 'ggets'? Dù sao, bất kể những gì bạn nghĩ về sự tỉnh táo của CBFalconer, bạn nên đánh giá mã, không phải là tác giả. Nếu bạn có khiếu nại cụ thể chống lại việc thực hiện 'ggets', đủ công bằng, nhưng tôi không nghĩ rằng nó công bằng để downvote chỉ vì bạn không thích anh chàng. – jamesdlin

-1

intially gửi dữ liệu sử dụng Payload_ID 00 01 02 03 .... 10

sử dụng

char * pChar = ""; // để bắt chuỗi.

fprintf (fp1, "% s", strtok (pChar, "Payload_ID"));

+0

tại đây Payload_ID là dấu phân cách mà bạn có thể chỉ định –

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