Linux系統編程10標準IO - getline

在這裏插入圖片描述

前面所瞭解的函數沒有一個可以幫助我們完整的獲取一行數據

現在有了 :getline()

NAME
getline, getdelim - delimited string input

SYNOPSIS
#include <stdio.h>

   ssize_t getline(char **lineptr, size_t *n, FILE *stream);

   ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

getline() reads an entire line from stream, storing the address of the buffer containing the text into *lineptr. The buffer is null-terminated and includes the newline character, if one was found.

從 stream流中讀取完整的一行內容。並將讀取到一行字符的緩衝區地址存儲到 指針變量 lineptr。

CONFORMING TO
Both getline() and getdelim() were originally GNU extensions. They were standardized in POSIX.1-2008.

/*
char **lineptr : 讀出來的一行字符的buffer的地址
size_t *n,該空間的大小值的地址
目標文件
*/
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

該函數內部機制是這樣的。首先我們自己定義一個字符指針,該指針指向的空間用於存放我們讀取出來的當前一行的字符,但是我們只提供字符指針,至於該字符指針指向哪一塊內存空間,指向多大的內存空間 都不是我們決定的,是函數內部幫我們實現的。我們只負責傳遞如下3個參數:

字符指針,指向存儲目標文件目標行的字符的空間
整型值地址,用於記錄 爲我們申請的空間有多大,我們可以直接查看該值。
目標文件

經過試驗,發現 如果靠前幾行每一行的字符數不足120個字符,那麼每一行申請的空間就是120,如果大於120,那麼就申請240。。。。

猜測過程
getline 是以行爲單位的操作,返回是每一行的數據,假如目標文件第一行只有50和字符,那麼在函數內部,就會將我們的字符指針指向一個大小爲120個字節的堆空間,將讀來的數據存儲在該空間,如果目標文件中某一行的數據比較大,比操作上一行數據時候所申請的空間容量大,那麼該函數就會將我們的字符指針指向的空間進行擴容,以存儲新的一行的數據,那麼操作完該行之後,下一行的數據默認以上一行所用的空間爲基礎繼續操作。

返回值
On success, getline() and getdelim() return the number of characters read, including the delimiter character, but not including the terminating null byte (’\0’). This value can be used to handle embedded null bytes in the line read.

getline 使用

#include<stdio.h>
#include<stdlib.h>
#include <errno.h>
#include <string.h>

int main(int argc,char** argv)
//int main(int argc,char *argv[])
{
	FILE *fp;
	char *linebuf = NULL;
	size_t linesize = 0;

	if(argc < 2)
	{
		fprintf(stderr,"Usage:%s <src_file>\n",argv[1]);
		exit(1);	
	}
	
	fp = fopen(argv[1],"r");
	if(fp == NULL)
	{
		fprintf(stderr,"fopen() failed! errno = %d\n",errno);
		exit(1);
	}

	while(1)
	{
		if(getline(&linebuf,&linesize,fp) < 0)
		break;
		printf("%d\n",strlen(linebuf));
		printf("%d\n",linesize);
	}
	fclose(fp);
	exit(0);
}

mhr@ubuntu:~/work/linux/stdio/gerline$ ./a.out test
18
120
19
120
18
120
19
120
11
120
1
120
mhr@ubuntu:~/work/linux/stdio/gerline$

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章