涉及到的字符有以下兩種java
* CR - 0x0d, 回車符,在代碼裏用'\r'表示 * LF - 0x0a,換行符,在代碼裏用'\n'表示
不一樣環境下,默認的換行符(字符序列)不一樣,須要說明的是,這個序是邏輯序,真實的物理序還要考慮大小端的問題python
* Win - CRLF,字符序列是'\r\n' * Linux/Unix - LF,字符序列是'\n' * Mac - CR, 字符序列是'\r' * HTTP - CRLF,但實際上,LF被普遍支持了
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內存
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讀取文件分爲2類,按二進制讀取和按文本讀取,均使用readline
方法:table
二進制讀取 - 只識別LF
文本讀取 - 識別 CR, LF, CRLF,均被轉爲 LF
從stdin讀取時,貌似相似於二進制讀取的狀態
Python讀取會不會去除CR, LF和CRLF(但可能會將CR, CRLF轉爲LF)
Java.io.BufferedReader.readline()
相似於python的readline文本讀取,能夠識別CR, LF, CRLF。
而且會去除掉行尾的換行字符序列。
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 | × | √ | √ | √ | 防止讀寫越界 |