[英]How to skip empty lines without string class
在以下代碼中,我無法使用std::string
類。
我正在嘗試讀取包含空行的文件,並且遇到空行時我想忽略它們。
我使用一個簡化的示例和一個包含空行的虛構文本文件測試了一些想法。
int main() {
ifstream fin;
fin.open("test.txt");
if(fin.fail()){
cout << "Input file fail.";
exit(-1);
}
char line[10];
while(!fin.eof()){
fin.getline(line, 10);
if(line[0] == '\n')
cout << "skip" << "\n";
else
cout << line << "\n";
}
}
我也嘗試過strlen(line) == 1
類的東西,但到目前為止沒有任何效果。
問題是什么?
std::getline()
已經處理了'\\n'
字符(它將被丟棄),如果輸入為空,則line[0]
將包含'\\0'
。
只需比較'\\0'
而不是'\\n'
:
if(line[0] == '\0')
cout << "skip" << "\n";
else
cout << line << "\n";
我也嘗試過
strlen(line) == 1
如果是這樣,那不是應該strlen(line) == 0
代表一個空行嗎?
您的代碼有兩個問題。 首先是循環不正確。 您必須檢查getline()
調用的結果,而不是eof()
。 請參閱為什么循環條件內的iostream :: eof被認為是錯誤的 。 重組的循環變為:
while (fin.getline(line, 10)) {
...
}
接下來,當您使用getline()
讀取一行(而10似乎確實是一行的縮寫)時,定界符將不會成為正文的一部分。 不會有一個\\n
在line
,當你在做閱讀。 您將只有一個空字符串。 因此,丟棄空行的正確方法是:
while (fin.getline(line, 10)) {
if (line[0]) {
// we have contents!
}
}
或者說真的, std::string
更好:
std::string line;
while (std::getline(fin, line)) {
if (!line.empty()) {
....
}
}
std::getline()
放棄定界符\\n
。 但是,您可能還想考慮在某些系統上,行可能由\\r\\n
分隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.