2012-03-01 35 views
7

tôi đã cố gắng để làm điều đó như thế nàyLàm thế nào để đọc một số tiền cụ thể của các nhân vật từ một tập tin văn bản

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char b[2]; 
    ifstream f("prad.txt"); 
    f>>b ; 
    cout <<b; 
    return 0; 
} 

Nó nên đọc 2 nhân vật nhưng nó đọc toàn bộ dòng. Điều này làm việc trên một ngôn ngữ khác nhưng không hoạt động trong C++ vì một lý do nào đó.

+0

+1 và "Cảm ơn" để cung cấp chương trình mẫu ngắn, hoàn chỉnh. http://sscce.org –

+4

"Điều này làm việc trên một ngôn ngữ khác nhưng không hoạt động trong C++ vì một số lý do." Đây là một trong những giả định tồi tệ nhất mà bạn có thể thực hiện trong lập trình. Họ là hai ngôn ngữ khác nhau, vì vậy họ có thể có hành vi khác nhau. – PlasmaHH

+0

Vâng, thật là nguy hiểm khi đi xung quanh nghĩ về điều đó. Nếu bạn đến với C++ từ Java (nó giống như lỗi của bạn) bạn thực sự cần phải ngồi xuống với một số đọc trên con trỏ và mảng và chắc chắn rằng bạn có được những gì đang xảy ra trước khi bạn bắn mình vào chân. – zmccord

Trả lời

8

Bạn có thể sử dụng read() để xác định số ký tự để đọc:

char b[3] = ""; 
ifstream f("prad.txt"); 

f.read(b, sizeof(b) - 1); // Read one less that sizeof(b) to ensure null 
cout << b;    // terminated for use with cout. 
+1

Để làm cho mối quan hệ giữa '3' và' 2' hiển nhiên hơn một chút, tôi khuyên bạn nên sử dụng hằng số có tên. 'size_t const BufferSize = 2;', 'char b [BufferSize + 1] =" ";' và 'f.read (b, BufferSize);' –

+0

@MatthieuM., tôi thường sử dụng 'sizeof (b) - 1 '(nếu có thể). Đã cập nhật mã. – hmjd

+0

Tôi luôn miễn cưỡng đề nghị điều này, bởi vì nếu 'b' là một con trỏ thì trình biên dịch vẫn hoạt động bằng cách bạn có được một' 7' cố định trên nền tảng 64 bit. Tuy nhiên, bạn có thể sử dụng hàm 'size' cho mảng, với các mẫu dễ dàng. –

0
istream& get (char* s, streamsize n); 

chiết xuất từ ​​nhân vật từ con suối và lưu trữ chúng như một c-string vào mảng bắt đầu từ s. Các ký tự được trích xuất cho đến khi một trong hai (n - 1) các ký tự đã được trích xuất hoặc ký tự phân cách '\ n' là được tìm thấy. Quá trình trích xuất cũng dừng lại nếu kết thúc tập tin trong chuỗi đầu vào hoặc nếu xảy ra lỗi trong quá trình nhập. Nếu ký tự phân cách được tìm thấy, nó không được trích xuất từ ​​chuỗi đầu vào và vẫn là ký tự tiếp theo cần trích xuất. Sử dụng getline nếu bạn muốn nhân vật này được trích xuất (và bỏ đi). Ký tự null kết thúc báo hiệu kết thúc của chuỗi c là được tự động nối vào cuối nội dung được lưu trữ trong s.

2

Điều này làm việc trên ngôn ngữ khác nhưng không hoạt động trong C++ vì lý do số .

Một số thứ thay đổi từ ngôn ngữ này sang ngôn ngữ khác. Đặc biệt, trong trường hợp này, bạn đã chạy một sự thật rằng trong C++ con trỏ và mảng là khác nhau rất ít. Mảng đó được chuyển tới toán tử >> như một con trỏ tới char, được hiểu là một con trỏ chuỗi, vì vậy nó làm những gì nó làm với bộ đệm char (để wit đọc cho đến khi giới hạn chiều rộng hoặc kết thúc của dòng, tùy điều kiện nào đến trước). Chương trình của bạn phải bị lỗi khi điều đó xảy ra, vì bạn đang tràn bộ đệm của mình.

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