2010-05-09 40 views
10

Tôi đang sử dụng C và kiến ​​thức của tôi rất cơ bản. Tôi muốn quét một tập tin và nhận được các nội dung chỉ sau dòng đầu tiên hoặc thứ hai ...Cách bỏ qua dòng đầu tiên khi fscanning tệp .txt?

tôi đã cố gắng:

fscanf(pointer,"\n",&(*struct).test[i][j]); 

Nhưng cú pháp này chỉ đơn giản là bắt đầu từ những dòng đầu tiên = \

Sao có thể như thế được ?

Cảm ơn.

Trả lời

13

fgets sẽ nhận một dòng và đặt con trỏ tệp bắt đầu từ dòng tiếp theo. Sau đó, bạn có thể bắt đầu đọc những gì bạn muốn sau dòng đầu tiên đó.

char buffer[100]; 
fgets(buffer, 100, pointer); 

Nó hoạt động miễn là dòng đầu tiên của bạn dài hơn 100 ký tự. Nếu không, bạn phải kiểm tra và lặp lại.

+0

Cảm ơn công trình này hoàn hảo !! – NLed

+0

Cảm ơn, tôi đã tạo câu hỏi rồi xóa nó và tìm câu trả lời của tôi ở đây :) – Bionix1441

12

Nó không rõ ràng những gì bạn đang cố gắng để lưu trữ dữ liệu của bạn vào vì vậy nó không dễ đoán ra câu trả lời, bằng cách này bạn chỉ có thể bỏ qua byte cho đến khi bạn đi qua một \n:

FILE *in = fopen("file.txt","rb"); 

Sau đó, bạn có thể hoặc bỏ qua một dòng toàn với fgets nhưng nó là không an toàn (vì bạn sẽ cần phải ước lượng độ dài của dòng a priori), nếu không sử dụng fgetc:

uchar8 c; 
do 
    c = fgetc(in); 
while (c != '\n') 

Cuối cùng, bạn nên có định dạng specifiers bêncủa bạnđể phân tích cú pháp dữ liệu thực tế, như

fscanf(in, "%f", floatVariable); 

bạn có thể tham khảo here để biết thông số.

+0

Cảm ơn bạn đã trả lời, tôi đã thử sử dụng '" rb "' nhưng công việc đó không hoạt động: ( Cảm ơn bạn đã liên kết đến specifiers, im kiểm tra chúng ngay bây giờ – NLed

+3

Nó không nên là "rb" nhưng chỉ "r" – Casey

+0

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/ – Casey

2

fgets sẽ hoạt động tại đây.

#define MAX_LINE_LENGTH 80 

char buf[MAX_LINE_LENGTH]; 

/* skip the first line (pFile is the pointer to your file handle): */ 
fgets(buf, MAX_LINE_LENGTH, pFile); 

/* now you can read the rest of your formatted lines */ 
24

tôi đã có thể bỏ qua dòng với scanf với hướng dẫn sau đây:

fscanf(config_file, "%*[^\n]\n", NULL); 

chuỗi định dạng đại diện cho một dòng chứa bất kỳ ký tự bao gồm cả khoảng trắng. Các * trong chuỗi định dạng và con trỏ NULL có nghĩa là chúng tôi không quan tâm đến việc lưu các dòng, nhưng chỉ trong incrementing vị trí tập tin.

Format chuỗi giải thích:
% là nhân vật mà mỗi chuỗi định dạng scanf bắt đầu với;
* cho biết không đặt mẫu tìm thấy ở bất kỳ đâu (thông thường bạn lưu mẫu được tìm thấy thành các tham số sau chuỗi định dạng, trong trường hợp này tham số là NULL);
[^\n] có nghĩa là bất kỳ ký tự nào ngoại trừ dòng mới;
\n có nghĩa là dòng mới;

để [^\n]\n có nghĩa là dòng văn bản đầy đủ kết thúc bằng dòng mới.

Tham khảo here.

+1

Đây là giải pháp tối thiểu nhất và hoạt động của nó tuyệt vời, cảm ơn! –

+0

Tuy nhiên, tôi thực sự không hiểu. Nếu bạn có thể giải thích thêm, nó sẽ giúp nhiều người hơn như tôi. Tôi không bao giờ thấy ''% * [^ \ n] \ n "' trước đây. – buzhidao

+0

@buzhidao the ' * 'hướng dẫn' fscanf' (tất cả các gia đình 'scanf', trên thực tế) phân tích dữ liệu như được trình bày trong chuỗi định dạng, nhưng KHÔNG lưu trữ dữ liệu ở bất kỳ địa chỉ đích nào (tốt, bởi vì không có gì được cung cấp trong một danh sách đối số). '[^ \ n]' có nghĩa là tak e bất cứ điều gì * ngoại trừ * một dòng mới, vì vậy TẤT CẢ dữ liệu sẽ được tiêu thụ lên đến (nhưng không bao gồm) dòng mới. Cuối cùng, '\ n' cuối cùng có nghĩa là" và tiêu thụ (và bỏ qua) dòng mới "(mà chúng ta vừa dừng lại khi hoàn thành đặc tả định dạng trước đó). Btw, NULL không được yêu cầu trong danh sách đối số. – WhozCraig

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