第13周-專案1-小玩檔案-將文字檔案中的所有行加上行號後寫到新檔案中
問題及程式碼:
執行結果:
檔案修改。
執行結果:
/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*檔名稱:File.cpp
*作 者:單昕昕
*完成日期:2015年6月8日
*版 本 號:v1.0
*問題描述:將文字檔案abc.txt中的所有行加上行號後寫到newabc.txt檔案中。
*程式輸入:檔案讀取。
*程式輸出:將文字檔案中的所有行加上行號後寫到新檔案中。
*/
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
fstream outfile,infile;
infile.open("abc.txt",ios::in); // (1)
if(!infile) {
cout<<"Can’t open the file."<<endl;
abort();
}
outfile.open("newabc.txt",ios::out);//(2)
if(!outfile) {
cout<<"Can’t open the file."<<endl;
abort();
}
char buf[80];
int i=1;
while(!infile.eof()) // (3)
{
infile.getline(buf,80); // (4)
outfile<<i++<<": "<<buf<<endl; //(5)
}
infile.close();
outfile.close();
return 0;
}
執行結果:
檔案修改。
學習心得:
貌似出了點問題。。求指教。。
修正後的程式碼:
/*
*Copyright (c)2015,煙臺大學計算機與控制工程學院
*All rights reserved.
*檔名稱:File.cpp
*作 者:單昕昕
*完成日期:2015年6月8日
*版 本 號:v2.0
*問題描述:將文字檔案abc.txt中的所有行加上行號後寫到newabc.txt檔案中。
*程式輸入:檔案讀取。
*程式輸出:將文字檔案中的所有行加上行號後寫到新檔案中。
*/
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
fstream outfile,infile;
infile.open("abc.txt",ios::in); // (1)
if(!infile) {
cout<<"Can’t open the file."<<endl;
abort();
}
outfile.open("newabc.txt",ios::out);//(2)
if(!outfile) {
cout<<"Can’t open the file."<<endl;
abort();
}
char buf[1000];
int i=1;
while(!infile.eof()) // (3)
{
infile.getline(buf,1000); // (4)
outfile<<i++<<": "<<buf<<endl; //(5)
}
infile.close();
outfile.close();
return 0;
}
執行結果:
錯誤原因:
當abc.txt檔案中存在長於80個字元的行時,程式會陷入死迴圈。通過跟蹤發現,從當遇到這個“超長”的行時,infile.getline(buf, 80)先讀出79個字元,以\0結束,之後再讀,buf[0]總是\0,同時!infile.eof()為假,所以進入死迴圈。懷疑這其中該是這種“截斷”式讀取超長行帶來的副作用。參看《getline的獲取ifstream的資料》,其中給出瞭解釋與對策。
顯然,當初的這個程式並未考慮超長行,而是預設每一行都不會達80個字元而設計的。注意:如果某一行就這樣被“截斷”了,並不意味著這就是一行,直到找到換行符,才能說明這是一行的結束,行數i++才能執行,這個程式的改進又可以進行了。
相關文章
- 檔案排版(文字檔案讀寫)
- VBA建立文字檔案、讀寫文字檔案
- 第13周-專案1-小玩檔案-用鍵盤輸入檔名,統計輸出檔案中每個字母、數字字元出現的次數字元
- 如何在“我的所有檔案”中隱藏某些檔案?
- 重新命名vue檔案後ts爆紅。檔案xxx不在專案xxx的檔案列表中。專案必須列出所有檔案,或使用 "include" 模式。Vue模式
- C#讀取文字檔案和寫文字檔案C#
- 第14周-閱讀專案1-二進位制檔案的讀寫
- TC中開啟檔案和寫入檔案
- 亂序排列檔案中的所有行(轉)
- mapreduce將若干小檔案合成大檔案
- 將framework檔案放在一個單獨的檔案中Framework
- 去掉linux文字檔案中的 ^M 符號Linux符號
- 遍歷檔案Java中遍歷出指定目錄中的所有檔案Java
- golang寫入檔案時,覆蓋前檔案(將前檔案清空)Golang
- 第13周-專案1-小玩檔案-用鍵盤輸入檔名,統計輸出類似下面的資料
- C# 替換文字檔案中的某一行 (要求此檔案存在)C#
- 檔案操作之按照行讀寫檔案
- 第13周-閱讀專案1-標準輸入輸出物件及文字檔案物件
- 【Java】讀寫文字檔案Java
- oracle中的 RESIZE檔案or ADD檔案Oracle
- maven專案打包後war檔案丟失配置檔案Maven
- Golang專案中讀取配置檔案Golang
- springboot專案中yaml檔案Spring BootYAML
- 將ASD光譜儀的.asd檔案轉為文字檔案
- 在Xcode專案中執行Python檔案XCodePython
- 獲取一個資料夾下所有指定字尾名(.java)的檔案(包括子資料夾中的內容),並將這些檔案的絕對路徑寫入到一個文字檔案中Java
- 將ASM裡面的檔案copy到檔案系統ASM
- 將 crt 檔案匯入到 jks 檔案 -cg
- 從C檔案到可執行elf檔案
- 從ASM磁碟中複製檔案到本地檔案系統ASM
- Python中的檔案讀寫Python
- Java中檔案的讀寫操作Java
- 【備份恢復】所有控制檔案丟失後 利用trace中的控制檔案備份執行恢復
- JSP中的TAG檔案和TLD檔案JS
- oracle中移動控制檔案、資料檔案、日誌檔案Oracle
- 使檔案中的所有行對齊縮排命令
- 如何在 Linux shell 中找出所有包含指定文字的檔案Linux
- 中轉檔案