2012-02-03 24 views
7

Trong một dự án, tôi phải đọc một tệp và tôi phải làm việc với số ký tự trong tệp và có cách để lấy số ký tự mà không đọc nó ký tự theo ký tự (nếu không tôi sẽ phải đọc tệp hai lần, một lần chỉ để tìm số ký tự trong đó).Làm thế nào để tìm số lượng ký tự trong một tệp mà không vượt qua nội dung

Thậm chí có thể không?

+0

Trong tiêu chuẩn thuần túy C++ hoặc API hệ điều hành cụ thể cũng được chấp nhận? Có các chức năng không di động (ví dụ: ['GetFileSizeEx()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364957 (v = vs.85) .aspx)) để nhận kích thước tệp. –

+0

Bạn muốn nhận kích thước của tệp? –

+0

Vâng, đó là bài tập về nhà và tôi không được phép sử dụng API. Tất cả những gì tôi được phép sử dụng là chức năng iostream và fstream. Thậm chí không dây. – SpeedBirdNine

Trả lời

8

Bạn có thể thử này:

FILE *fp = ... /*open as usual*/; 
fseek(fp, 0L, SEEK_END); 
size_t fileSize = ftell(fp); 

Tuy nhiên, điều này trả về số byte trong file, không phải là số ký tự. Nó không giống nhau trừ khi mã hóa được biết là một byte cho mỗi ký tự (ví dụ: ASCII).

Bạn sẽ cần phải "tua lại" các tập tin trở lại bắt đầu sau khi bạn đã học được những kích thước:

fseek(fp, 0L, SEEK_SET); 
+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ! – SpeedBirdNine

+0

UTF-8 là mã hóa độ dài biến đổi. –

+1

@ AndréCaron Cảm ơn bạn đã sửa! – dasblinkenlight

1

Tôi nghĩ bạn có thể đang tìm kiếm giải pháp động bộ nhớ động. Những gì bạn thực sự hỏi là "là có một cách để có được số lượng ký tự trong một tập tin mà không cần đọc nó?". Câu trả lời (giả sử một byte cho mỗi ký tự) là có, bạn có thể sử dụng cuộc gọi stat để nhận kích thước tệp và kích thước tệp theo byte là số ký tự. Với UTF-8 câu trả lời là không, nhưng chúng ta hãy bỏ qua một chút cho thời điểm này vì các nhà khoa học máy tính chỉ học hỏi thường không lo lắng về quốc tế hóa.

Tôi nghĩ lý do bạn muốn biết có bao nhiêu ký tự để bạn có thể lưu trữ đủ lớn để giữ tất cả. Bạn không cần phải biết tập tin lớn đến mức nào để lưu trữ toàn bộ.

Nếu bạn có std::vector<char>, nó có thể bắt đầu có thể chứa mười ký tự, sau đó tăng lên để giữ hai mươi, sau đó mười nghìn ... Và khi bạn đọc xong, nó sẽ giữ tất cả, mặc dù bạn không bao giờ biết bao nhiêu sẽ có.

1

Off đỉnh đầu của tôi là để có một cái nhìn vào kích thước tập tin và chia rằng bao nhiêu byte một ký tự là?

Sự cố phát sinh khi giao dịch với khoảng trắng và dòng kết thúc, v.v.

11

Có.

Tìm kiếm ở cuối có vị trí cuối cùng là kích thước.

FILE* file = fopen("Plop"); 
fseek(file, 0, SEEK_END); 
size_t size = ftell(file);  // This is the size of the file. 
           // But note it is in bytes. 
           // Also note if you are reading it into memory this is 
           // is the value you want unless you plan to dynamically 
           // convert the character encoding as you read. 

fseek(file, 0, SEEK_SET);  // Move the position back to the start. 

Trong C++ dòng có chức năng tương tự:

std::ifstream file("Plop"); 
file.seekg(0, std::ios_base::end); 
size_t size = file.tellg(); 

file.seekg(0, std::ios_base::beg); 
+0

Cảm ơn, cả bạn và câu trả lời được chấp nhận đều hữu ích như nhau, tôi đã chọn câu trả lời có nhiều phiếu bầu hơn. Cảm ơn rất nhiều cho câu trả lời một lần nữa! – SpeedBirdNine

1

Câu trả lời đơn giản là không. Chính xác hơn, hệ thống phụ thuộc: dưới Unix, có thể (ví dụ: sử dụng stat); dưới Windows, không phải là đối với tệp văn bản, nhưng nếu bạn đang đọc tệp dưới dạng nhị phân, có chức năng GetFileSize có thể được sử dụng.

Mặc dù không được bảo đảm, dưới tất cả các hiện thực Tôi biết (ví hai nền tảng này), tìm cách kết thúc của tập tin, sau đó làm một ftell, sẽ trở lại một cái gì đó mà khi chuyển đổi sang một thể thiếu đủ lớn loại, sẽ cho kết quả tương tự như trên (với các hạn chế tương tự ).

Cuối cùng: tại sao bạn cần thông tin này? Nếu chỉ phân bổ một bộ đệm có kích thước thích hợp , ngay cả với tệp văn bản, GetFileSize (và tell sau khi tìm kiếm kết thúc) sẽ trả lại giá trị lớn hơn hơn số byte bạn có thể đọc. Bạn là bộ đệm sẽ hơi quá khổ, nhưng điều này thường không phải là một vấn đề.

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