-
21-10-2008, 09:03 AM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
hỏi về các hàm allocate trong tập tin
các bạn coi dùm mình đoạn code này nha:
Mã:#include<fstream> #include<iostream> #include<stdlib.h> using namespace std; void main() { char ch; int i= 0; char* Arr = new char[]; ifstream fi; fi.open("test file.txt"); if(fi.is_open()) { while(fi.good()) { fi.get(ch); (char*) realloc(Arr,(i+2)*sizeof(char)); Arr[i]= ch; i++; } fi.close(); Arr[i]= '\0'; cout<<Arr<<endl; } else cout<<"error open file! "; }
nếu như lúc đầu mìnhMã:char* Arr = new char[1000];
cảm ơn các bạn!View more random threads:
- Debug in VC++6 | One or more BreakPoints cannot be set and have been disabled.
- Lập trình VC++6 | Load một file ảnh vào HDC như thế nào?
- Điều kiện của if
- Thư viện audio cho c++. xin giúp đỡ?
- mảng cấu trúc dùng con trỏ. Giúp?
- Compile mã nguồn mở Winpcap trong môi trường VS 2010 như thế nào?
- Thắc mắc C++
- Lập trình C++ | Dấu & trong khai báo hàm?
- Hiển thị dữ liệu từ RCordSet lên Ctrl List !
- Tìm ký tự trong chuổi. Giúp mình hiểu mã nguồn?
-
21-10-2008, 09:13 AM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình ko hiểu, new cũng là cấp phát động mà bạn, xài mấy hàm cấp phát kia làm gì, xài new cho khỏe ?
-
21-10-2008, 09:42 AM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
- Trước giờ chưa bao giờ xài realloc, mới google xong thì thấy nó nhận vào 1 void* ptr và 1 size, nhưng đối với bài cậu là sai vì tui thấy ý cậu muốn cấp phát lại và giữ lại nội dung file sau khi cấp phát lại. Tui khuyên cậu nên dùng std::vector< > cho cấp phát động vì nó tự động grow lên được. Làm thế này quá ư là expensive.
- Và đây tui nghĩ là cái cậu cần [IMG]images/smilies/wink.png[/IMG]
Mã:#include <fstream>#include <iostream>#include <algorithm> namespace r2 { template< typename T > void realloc( T*& ary, std::size_t old_size, std::size_t new_size ) { T* arycopy = new T[ old_size ]; std::copy( ary, ary + old_size, arycopy ); delete[] ary; ary = new T[ new_size ]; std::copy( arycopy, arycopy + old_size, ary ); delete[] arycopy; }} int main(){ char ch; std::size_t idx = 1; // a character and '\0' char* file_content; std::ifstream fi; fi.open( "t.txt" ); file_content = new char[ idx ]; if( !fi.fail() ) { while( fi >> ch ) { std::cout << "... reading character : " << ch << " "; *( file_content + idx - 1 ) = ch; r2::realloc< char >( file_content, idx, ++idx ); } fi.close(); file_content[ idx ] = '\0'; std::cout << " File_content : " << file_content << " "; delete[] file_content; } else { std::cout << " File could not found ! "; } return 0;}
-
21-10-2008, 11:06 AM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
hix. em thật sự hâm mộ tài năng của bác rox_rook, ko biết đến ngày nào em mới dc như bác. Em chỉ là dân mới vô nghề thôi, nên code của bác chắc em chỉ dám gọi là "ngâm cứu" chứ thật sự là không biết sài. Mong bác thông cảm cho! Em cám ơn bác rất nhiều, thực sự là code của bác "quá sức" đối với em![IMG]images/smilies/wings_cry.gif[/IMG]
còn nếu xài hàm new thay cho realloc thì ko dc! nó sẽ xóa hết toàn bộ dữ liệu cũ! mình muốn nó cấp phát thêm chứ ko phải là cấp phát lại mới!
các bạn xem lại giúp mình nha.
Minh thắc mắc là tại sao thay realloc bằng new thì nó chạy? cả 2 đều là cấp phát bộ nhớ mà? có "phân biệt đối xử" chăng?
-
21-10-2008, 11:13 AM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
- Cậu không hiểu dòng code nào, cứ post lên hỏi tui sẽ giải thích từng dòng cho cậu hiểu.
- Code đó rất đơn giản với ý tưởng tui truyền con trỏ cần khởi tạo lại vào 1 hàm( có ý nghĩa tuơng tự realloc ). Và tất nhiên muốn lưu trữ lại kết quả nó đang có thì bắt buộc tui phải có 1 mãng phụ lưu trữ kết quả hiện thời( mãng arycopy ).
- std::copy() là hàm y như for loop, tuy vậy nó ở 1 higher level abstraction. Vì khi cậu nhìn vào 1 for-loop, tất cả những gì cậu hình dung ra chỉ là nó lặp lại và làm 1 cái gì đó.
Nhưng khi cậu đọc vào copy() -> cậu biết ngay đoạn này dùng để copy 2 mãng. Vì vậy trong C++ dùng STL lúc nào cũng được best-performance.
- Tui dòng template<> vì nó generic, sau này tui muốn dùng cho mãng int, double ...etc tui không phải viết lại, thế thôi.
- Còn về sugar syntax với con trỏ thì cậu chưa quen nên nhìn nó mới rắc rối thế.
- Nếu còn thắc mắc : post + hỏi [IMG]images/smilies/wink.png[/IMG] !
-
21-10-2008, 11:53 AM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
nhưng này bác rox_rook ơi, ý em muốn hỏi ở đây là tại sao em dùng realloc chỗ đó ko dc? trong khi nếu em dùng chỗ khác thì dc. ví dụ như là em dùng để nhập cho một char* (gõ từ bàn phím) mà ko cần biết trước độ dài người dùng gõ vào.
bác xem giúp em xem là trong tập tin có phải là chỗ đó nó ko dùng dc phải ko nhé, hay là em sai lỗi đâu đó?
cảm ơn bác nhiều!
-
21-10-2008, 12:11 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mã:Arr = (char*) realloc(Arr,(i+2)*sizeof(char));
- Còn lỗi của cậu là thiếu phép gán. Với lại cậu dùng new + realloc() là không đúng, vì realloc cần gọi free() để giải phóng trong khi cậu lại pass 1 con trỏ được khởi tạo với new vào.
- Implementation của hàm realloc() thì tui không thể nào biết được internal nó hoạt động ra sao nên không thể giải thích lỗi gì nếu dùng new + free() được.
ví dụ như là em dùng để nhập cho một char* (gõ từ bàn phím) mà ko cần biết trước độ dài người dùng gõ vào.
-
21-10-2008, 12:36 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
í dụ như là em dùng để nhập cho một char* (gõ từ bàn phím) mà ko cần biết trước độ dài người dùng gõ vào.
Mã:char* input_string( char delim ) { int idx = 1; char* storage; char c; storage = new char[ 1 ]; while( std::cin.get( c ) && c != delim ) { storage[ idx - 1 ] = c; r2::realloc( storage, idx, ++idx ); } storage[ idx ] = '\0'; return storage;} int main (){ std::cout << "Input a string ( enter to end ): "; char* str = input_string( ' ' ); std::cout << str; delete[] str;}
Hiện nay trên thị trường xuất hiện rất nhiều loại thuốc bôi tăng kích thước dương vật được lăng xê là có khả năng làm tăng kích cỡ dương vật của cánh mày râu. Tuy nhiên không phải loại thuốc nào cũng...
Thuốc tăng kích thước chim có tác...