Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 8 của 8
  1. #1
    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!
    ";
    
    }
    tại sao nó ko làm việc đc vậy?
    nếu như lúc đầu mình
    Mã:
     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!

  2. #2
    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 ?

  3. #3
    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;}

  4. #4
    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?

  5. #5
    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] !

  6. #6
    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!

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    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 [IMG]images/smilies/wink.png[/IMG] ! 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 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.
    Thôi cho cậu luôn, ráng mà nghiền ngẫm, tui đi ngủ đã [IMG]images/smilies/wink.png[/IMG]

    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;}
    Bỏ thằng r2::realloc của tui vào mà xài nhé [IMG]images/smilies/wink.png[/IMG] !

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •