各類getline/readline的總結

關於換行

涉及到的字符有以下兩種java

* CR - 0x0d, 回車符,在代碼裏用'\r'表示
* LF - 0x0a,換行符,在代碼裏用'\n'表示

不一樣環境下,默認的換行符(字符序列)不一樣,須要說明的是,這個序是邏輯序,真實的物理序還要考慮大小端的問題python

* Win - CRLF,字符序列是'\r\n'
* Linux/Unix - LF,字符序列是'\n'
* Mac - CR, 字符序列是'\r'
* HTTP - CRLF,但實際上,LF被普遍支持了

Linux C

char *gets(char *str);
char *fgets(char *str, int size, FILE *stream);

gets在新的標準中已經被棄用了
fgets增長了size防止讀寫過界c++

這兩個函數只識別LF換行符,比較傻瓜。
其中gets會去除LF:函數

LF換行: 123LF456LF -> 123, 456
CR換行: 123CR456CR -> 123CR456CR
CRLF換行: 123CRLF456CRLF -> 123CR, 456CR

fgets不會去除LF:code

LF換行: 123LF456LF -> 123LF, 456LF
CR換行: 123CR456CR -> 123CR456CR
CRLF換行: 123CRLF456CRLF -> 123CRLF, 456CRLF
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

這兩個函數都不是C標準裏的,是POSIX標準的
這兩個函數會本身管理內存,保證分配足夠的內存來放置讀取的字符
getline相似於fgets,只識別LF,不會去除LF內存

C++

istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);

相似於gets,識別並去除LFget

basic_istream::getline
basic_istream& getline(char_type* s, std::streamsize count);
basic_istream& getline(char_type* s, std::streamsize count, char_type delim);

相似於gets,識別並去除LF
相似於fgets,防止讀寫過界string

C/C++均沒法處理跨平臺問題io

Python

Python讀取文件分爲2類,按二進制讀取和按文本讀取,均使用readline方法:table

  • 二進制讀取 - 只識別LF

  • 文本讀取 - 識別 CR, LF, CRLF,均被轉爲 LF

從stdin讀取時,貌似相似於二進制讀取的狀態
Python讀取會不會去除CR, LF和CRLF(但可能會將CR, CRLF轉爲LF)

Java

Java.io.BufferedReader.readline()

相似於python的readline文本讀取,能夠識別CR, LF, CRLF。
而且會去除掉行尾的換行字符序列。

Go

bufio
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

line 的內存由 ReadLine管理,bool表示是否讀取完整。
只能識別並去除 LF, CRLF。

總結

方式 支持CR 支持LF 支持CRLF 去除行尾 防止越界
c/gets × × ×
c/fgets × × × 防止讀寫越界
c/getline × × × 重分配內存
c++/::getline × × 不須要
c++/istream::getline × × 防止讀寫越界
python/readline 轉爲LF 不須要
java/readline 不須要
go/ReadLine × 防止讀寫越界
相關文章
相關標籤/搜索