C fscanf 讀取一整行

2021-09-06 15:56:34 字數 1007 閱讀 5466

**:

scanf, fscanf很相似,都是從流中讀取輸入,然後賦值給變數

int scanf(const char *format, ...)

int fscanf(file *stream, const char *format,...)

%c 單一字元

% 乙個字符集

* 輸入項讀入後跳過,不賦予任何變數

scanf, fscanf 自動跳過tabs和空格,其他字元賦予變數,返回成功賦值的變數數(整數),發生錯誤時返回eof

%[^\n] 表示讀取一整行,^ 表示 「非」,前面提到 % 表示乙個字符集,所以 %[^\n] 表示「遇到乙個換行符之前的所有字元的集合」,隨後就結束讀入。

char str[80];

fscanf(fp,"%[^\n]",str);

但是這麼做以後,那個換行符還沒有讀取。

前面提到了,* 表示輸入項讀入後跳過,所以 %*c 表示跳過乙個字元,所以可以寫

fscanf(fp, "%[^\n]%*c", str);

讀取換行符之前的所有內容,賦值給str,然後跳過換行符,指向下一行內容。

如果要跳過整行,可以寫

fscanf(fp, "%*[^\n]%*c");

但有時也會出錯,當快取中只有乙個 \n 時,%*[^\n] 發現 \n 之前沒有任何內容,會直接返回,後面的 %*c 不起作用。所以快取中只有 \n 時,上面那行**不管執行多少遍,都是什麼都不做。

為了避免上面的情況,可以修改為

fscanf(fp, "%*c%*[^\n]");

那麼如果快取中只有乙個 \n,%*c 會跳過它,%*[^\n] 會跳過下一行換行符之前的內容;如果快取中不是 \n,則 %*c 跳過第乙個字元,%*[^\n] 跳過後面的內容(換行符之前),即跳過一行,快取中留乙個 \n。

快取中留乙個 \n 不影響 %d, %lf 等語句,所以這麼寫更安全。

又為了跳過結尾的換行符,故改寫為

fscanf(fp, "%*c%*[^\n]%*c");

shell中for迴圈,讀取一整行

shell中for迴圈,讀取一整行 shell中for迴圈的預設分隔符是 空格 tab n 需求是只以 n作為分隔符 shell for迴圈以 n作為分割符,方式一 檔案aa.sh html view plain copy print?bin bash ifs n n for i in cat 1....

C 使用getline 讀取一整行

string s cin s cout 如上,在執行讀取操作時,string會自動忽略開頭的空白 即空格符 換行符 製表符等 並從第乙個真正的字元開始讀起,知道遇見下一處空白為止。例如程式輸入的是 abc 則輸出將是 abc 有時我們希望在最終得到的字串中保留輸入時的空白符,這時應該使用getlin...

Vim複製一整行和複製多行

1 複製 1 單行複製 在命令模式下,將游標移動到將要複製的行處,按 yy 進行複製 2 多行複製 在命令模式下,將游標移動到將要複製的首行處,按 nyy 複製n行 其中n為1 2 3 yy 複製游標所在的那一行 nyy 複製游標所在的向下n行 2 貼上 在命令模式下,將游標移動到將要貼上的行處,按...