Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: hỏi về các hàm allocate trong tập tin

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    5

    Mặc định 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:
    Code:
    #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";
    
    }
    tại sao nó ko làm việc đc vậy?
    nếu như lúc đầu mình
    Code:
     char* Arr = new char[1000];
    thì nó chạy và có thể bỏ hàm realloc cũng dc! Nhưng mình muốn cấp phát động cho chuỗi Arr, mong các bạn xem và giúp đỡ!
    cảm ơn các bạn!
    ko có việc gì khó, chỉ sợ... tiền ko nhiều...

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    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 ?
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - 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
    C++ Code:
    1. #include <fstream>
    2. #include <iostream>
    3. #include <algorithm>
    4.  
    5. namespace r2 {
    6.     template< typename T >
    7.     void realloc( T*& ary, std::size_t old_size, std::size_t new_size ) {
    8.         T* arycopy = new T[ old_size ];
    9.         std::copy( ary, ary + old_size, arycopy );
    10.         delete[] ary;
    11.         ary = new T[ new_size ];
    12.         std::copy( arycopy, arycopy + old_size, ary );
    13.         delete[] arycopy;
    14.     }
    15. }
    16.  
    17. int main()
    18. {
    19.     char          ch;
    20.     std::size_t   idx = 1; // a character and '\0'
    21.     char*         file_content;
    22.     std::ifstream fi;
    23.  
    24.     fi.open( "t.txt" );
    25.     file_content = new char[ idx ];
    26.  
    27.     if( !fi.fail() ) {
    28.         while( fi >> ch ) {
    29.             std::cout << "... reading character : " << ch << "\n";
    30.             *( file_content + idx - 1 ) = ch;
    31.             r2::realloc< char >( file_content, idx, ++idx );
    32.         }
    33.         fi.close();
    34.         file_content[ idx ] = '\0';
    35.         std::cout << "\n File_content : " << file_content << "\n";
    36.         delete[] file_content;
    37.     }
    38.     else {
    39.         std::cout << " File could not found !\n";
    40.     }
    41.  
    42.     return 0;
    43. }

  4. #4
    Ngày gia nhập
    09 2008
    Bài viết
    5

    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!
    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?
    Đã được chỉnh sửa lần cuối bởi thuantclv : 21-10-2008 lúc 04:43 PM. Lý do: thêm ý
    ko có việc gì khó, chỉ sợ... tiền ko nhiều...

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - 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 !

  6. #6
    Ngày gia nhập
    09 2008
    Bài viết
    5

    Mặc định hỏi về các hàm allocate trong tập tin

    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!
    ko có việc gì khó, chỉ sợ... tiền ko nhiều...

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. Arr = (char*) realloc(Arr,(i+2)*sizeof(char));
    - Do tui không xài nó nhiều, nên không rõ, đọc kĩ lại thì ra nó cũng giữ lại được nội dung ! My bad T_T !
    - 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.
    Ý tưởng này phải dùng std::string<>. Hoặc dùng 1 class object( bên trong là char* ) và quá tải lại toán tử >> để cho nhập vào, và mỗi lần nhập cậu sẽ gọi 1 hàm để add vào, chứ không thể nào vừa nhập vừa cấp phát kiểu đó được, code sẽ rất tối.

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    í 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.
    Thôi cho cậu luôn, ráng mà nghiền ngẫm, tui đi ngủ đã
    C++ Code:
    1. char* input_string( char delim ) {
    2.     int   idx = 1;
    3.     char* storage;
    4.     char  c;
    5.     storage = new char[ 1 ];
    6.     while( std::cin.get( c ) && c != delim ) {
    7.         storage[ idx - 1 ] = c;
    8.         r2::realloc( storage, idx, ++idx );
    9.     }
    10.     storage[ idx ] = '\0';
    11.     return storage;
    12. }
    13.  
    14. int main ()
    15. {
    16.     std::cout << "Input a string ( enter to end ): ";
    17.     char* str = input_string( '\n' );
    18.     std::cout << str;
    19.     delete[] str;
    20. }
    Bỏ thằng r2::realloc của tui vào mà xài nhé !

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn