42Seoul - get_next_line

13335 ワード

get_next_line

char *get_next_line(int fd)

特長


対応するfdファイルから、文章を行単位(開行文字で区切る)で読み込みます.返却には、開行文字も含まれています.
関数を呼び出すたびに、文章を行ごとに読みます.

戻り値


読み込みに成功した場合は1を返し、ファイルが終了した場合は0を返し、エラーが発生した場合は-1を返します.

先行知識


1.静的キーワード

  • の静的キーワードは、変数の前に添付され、関数内または関数外で宣言されます.
  • 静的[データ名][変数名];
    使用範囲は、宣言された関数内およびファイルでのみ使用できます.終了は、プログラムの終了時と同じです.
  • 함수 안에서는 **지역변수의 성향**을 가지지만 종료될 때까지 값이 남아있는 것이 특징이다.
    
    //예시 1
    #include <stdio.h>
    #include <stdlib.h>
    
    static int g_var; //0으로 초깃값이 설정된다.
    
     void func()
     {
    	 g_var++;
     }
     
     int main(void)
     {
    	printf("%d \n", g_var);	 
    	func();
    	printf("%d \n", g_var);
    
    	return (0);
     }
     
    
    
    //예시 2
     void func()
     {
    	static int	var;
    	printf("%d \n", var);
    	var++;
     }
     
     int main(void)
     {
    	printf("%d \n", g_var);	 
    	func();
    	printf("%d \n", g_var);
    
    	return (0);
     }

    2. read();


    プロトタイプsize_t read (int fd, void *buf, size_t nbytes) int fd==ファイルディスク立棒void *buf==ファイルを取得するバッファsize_t nbytes==バッファサイズ
    return =>size_t == -1 실패 0 == 정상적으로 실행되었다면 읽어들인 바이트 수

    3.FD (File Descriptor)


    Unix/Linuxシリーズのシステムは、すべてのファイルとディレクトリ、スロット、およびすべてのデバイスをファイルとして管理します.
    ファイルディスクバッチは、管理プロセスでファイルリストを開いたテーブルのインデックスであり、特定のファイルにアクセスするためにファイルディスクバッチが必要です.ファイルアドレスを参照してファイルにアクセスすることでファイルを処理します.
    デフォルトで割り当てられたファイルディスクエンドミル値
    0:標準入力(標準入力)
    1:標準出力(標準出力)
    2:標準エラー(標準エラー)
    また、ファイルディスクの立位は正の値であり、-1はエラーアクセス時に返されます.

    に答える


    例えば、a.txtというファイルに以下の形式のテキストが含まれていると仮定し、BUFFER SIZEが3であると仮定する.
    a.txt
    
    1 2 3 \n
    4 5 6 \n
    7 8 9
    
    大きなストリーム全体が静的ポインタ変数と文字列を返すポインタ変数を宣言します.
    1.静的変数lstrで123n 45までのbuff一時変数を使用します.
    2.返却には123nが必要で、lineにはlstrの123nのみを入れます.
    3.lstrでは、123n 45から出力されたコンテンツに加えて、45をlstrに入れて次の行の出力を行う.
     첫 실행
     
     1 2 3 \n 출력 전 lstr = 1 2 3 \n 4 5
     4 5 6 \n line = 1 2 3 \n
     7 8 9    출력 후 lstr = 4 5
     
    두 번째 실행
    
    1 2 3 \n 출력 전 lstr = 4 5
    4 5 6 \n line = 4 5 6 \n
    7 8 9	  출력 후 lstr = 7
    
    세 번째 실행
    
    1 2 3 \n 출력 전 lstr = 7 8 9
    4 5 6 \n line = 7 8 9
    7 8 9	  종료
    
    // 마지막 번째는 read를 하던 중 EOF를 만난다면 함수가 종료되고, 읽은 곳까지의 양수를 리턴한다.

    トラブルシューティング


    1.切替ポインタ


    gnlTesterに移動する過程で、次のようなコメントが出てきました.
    下端のコードをうろうろしてやっと見つけたのは円のポインタだった.
    /* free()를 사용하면 할당된 메모리를 해제할 수 있다. 
    그런데 포인터가 여전히 해제된 메모리 영역을 가리키고 있을 땐 문제가 될 수 있다. 
    이것을 댕글링 포인터라고 한다 */
    
    if (result == - 1)
    {
    	free(buffer);
      	return (0); <-- return (0);를 추가해줬다.
    }
    /*free()를 사용하면 할당된 메모리를 해제할 수 있다. 
    그런데 포인터가 여전히 해제된 메모리 영역을 가리키고 있을 땐 문제가 될 수 있다. 
    이것을 댕글링 포인터라고 한다. */
    
    int *ptr;
    ptr = malloc(sizeof(int));
    *ptr = 1;
    printf("%d\n", *ptr);
    
    free(ptr);
    *ptr = 2;   <-- 이렇게 ptr변수를 free()해준 이후에 다시 메모리에 접근하면 문제가 발생할 수 있다.
    
    
    //해결 방법
    
    int *ptr;
    
    ptr = malloc(sizeof(int));
    *ptr = 1;
    printf("%d\n, *ptr);
    
    free(ptr); 
    ptr = 0;  <-- 위와 다르게 포인터를 null로 바꾸면 포인터가 해제된 메모리를 가르키지 않아 잘못된 영역을 참조하지 않는다.
    

    2.OPEN MAXホットスポット


    OSを直接制御し、OPEN MAXよりも多くの数をファイルディスクのディスクディスクディスクとして使用できるという.
    したがって、OPEN MAXの値を定数としてヘッダファイルを使用することは考えられなかった.
    理由は以下の通り.
    OPEN MAXのようなメイクは汎用性のために使います.どのオペレーティングシステム環境でも、コンピュータの仕様にかかわらず、プログラムは正常に動作します.これらの理由から、macroを使用して、プログラムがより多くの環境で実行されることを保証する義務があります.

    参考資料


    コメントブログ