C++ 中關于文件的讀入和輸出。
Example : 從in.txt 文件中讀入數據,并輸出到out.txt中,輸出的文件中每行之間有一空行相隔
#include
#include
#include
using namespace std;
int main (int){
string s;
ifstream inf;
inf.open("in.txt");
//打開輸出文件
ofstream outf;
outf.open("out.txt");
//從in.txt 文件中讀入數據,并輸出到out.txt中
/*其中 getline(參1,參2); 作用是從 inf 指向的文件中
每次讀入一行,把數據存到字符串s 中,從第一行開始
每讀完一行后,系統自動地把指針指向下一行,不用人為
干預*/
while( getline(inf,s ) ){
outf << s << '\n\n'; //我這里并沒有用到字符串
cout << s << endl << endl; //數組,而是只用了一個串
} //S,是因為我每次讀入一行
//后,立即就把它輸出到
//out.txt中,跟著讀下一行
inf.close();
outf.close();
return 0;
}
========================================方法二============================================
#include
#include
#include
#include
using namespace std;
int main (int){
ifstream inf;
inf.open("in.txt");
ofstream outf;
outf.open("out.txt");
/*這道題有許多解法的,重要的要了它文件輸入輸出的原理
你可以一行行地讀入,也可以一個字一個字地讀入,或一個詞
一個詞地讀入,整型或浮點型讀入,看你定義的是哪種數據類型*/
char c;
inf >> noskipws; //不忽略空白,把每行最后那個'\n'
//也讀進來。
while(inf >>c)
{
if (c == '\n'){ //遇到 '\n' 回車、換行。
outf << "\n\n"; //輸出到文件
cout << "\n\n"; //輸出到屏幕
}
else{
outf << c; //輸出到文件
cout << c; //輸出到屏幕
}
}
/* 同樣的原理,從文件中讀入單個字符,每次讀入一個后,
系統自動地把指針指向下一個字,而不用你指定這次讀哪個,
下次讀哪個,除非你不想從第一個開始讀,比如說:我想從
第100個字開始讀,或者我想讀最后50個字。這就需要調用
相應的函數,并指定相應的位置。*/
inf.close();
outf.close();
return 0;
}
主 題: 請問VC++中,怎么實現讀取.txt文件時的行定位,就是讀取指定的行的內容.
請問VC++中,怎么實現讀取.txt文件時的行定位,就是讀取指定的行的內容.
?
一行一行的讀到你想要的那行。
CStdioFile的ReadString()方法是讀一行。
[VC] 文件對話框讀寫文本文件
2005年 01月23日
文件對話框讀寫文本文件/*************************************************
* 讀文本文件
**************************************************/
//顯示文件打開對話框
CFileDialog dlg(TRUE, "SQL", "*.txt",OFN_HIDEREADONLY
|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||");
if ( dlg.DoModal()!=IDOK ) return;
//獲取文件的絕對路徑
CString sFileName=dlg.GetPathName();
//打開文件
CStdioFile out;
out.Open(sFileName, CFile::modeRead);
CString sSql="",s;
//讀取文件
do{
out.ReadString(s);
sSql=sSql+s+"\r\n";
}while ( out.GetPosition()out.Close();
//AfxMessageBox(sSql);
/*************************************************
* 寫文本文件
**************************************************/
//顯示文件保存對話框
CFileDialog dlg(FALSE, "SQL", "*.txt",OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||");
if ( dlg.DoModal()!=IDOK ) return;
//獲取文件的絕對路徑
CString sFileName=dlg.GetPathName();
CStdioFile out;
//打開文件
out.Open(sFileName, CFile::modeCreate | CFile::modeWrite);
//保存文件
CString sSql="文本文件內容";
out.WriteString(sSql);
out.Close();
我要讀一個文件,但是我想讓一行一行的讀,而且每行有不一定長度的,應該怎么做呢?
(cqwally發表于2001-8-9 23:37:43)
1)
程序如下:
{
.....................
CStdioFile file;
CString str;
file.Open("test.txt",CFile::modeRead,NULL);
file.ReadString(str);
MessageBox(str);//第一行
file.ReadString(str);
MessageBox(str);//第二行
.....................
}
看看兩次顯示的有什么不同。test.txt文件如下:
第一行
第二行
2)
我用CFile::Write,怎樣才可以寫入回車,空格?而且我要寫兩欄要對齊?
回車換行:"\r\n"
如何正確的使用CFile::Open中的參數?
(taxiblackangel發表于2001-8-14 10:58:16)
[問題提出]
我設計了一個從記事本中讀數據的程序。將數據顯示在視中。
代碼如下:
void CTry1View::OnShow()
{
// TODO: Add your command handler code here
CStdioFile file;
CString filename;
CFileDialog opendlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,".(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);
if(opendlg.DoModal()==IDOK)
filename=opendlg.GetPathName();
if(file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::typeText)==0)
{
AfxMessageBox("error");
return;
}
while(file.ReadString(string))
{
strList.AddTail(string);
string.ReleaseBuffer();
}
flag=true;
Invalidate();
}
結果不但在視中沒有任何顯示,而且記事本中的數據也全部丟失。變成了一片空白。真是搞不懂了。
記事本中的數據是我隨便寫的。如下:
11
222
3333
44444
.......
[解決方法]
在file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::typeText)中,CFile::modeCreate去掉,modeCreate的意思是沒有此文件就建立,有了此文件,清空文件.
最新評論 [發表評論] 查看所有評論 推薦給好友 打印
最好是這樣file.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeText),因為CFile::modeNoTruncate意思是文件即使存在也不清空。 ( lichihang 發表于 2003-12-29 8:33:00)
如何使用CStdioFile::ReadString來讀文件?
(yello2000i發表于2001-8-16 17:04:39)
[問題提出]
一數據文件一行一條記錄,我用file.readstring()一次讀一行,并對讀取的數據做一些處理;
請問:while(文件還沒到結尾)
{
file.readstring();
...
}
??文件還沒到結尾如何判斷?
如果,到了指定位置不讀了,過一會兒再讀又如何做?
[解決方法]
while()中不用另加判斷條件了,因為CStdioFile::ReadString()本身就是判斷標志,若沒有了(文件到頭)返回NULL,因此:while(file.ReadString(s)){}就可.
[程序實現]
假設你已有了名為ts.txt的文件在你的工程目錄下:
{
CStdioFile file;
CString sss;
char ccc[100];
DWORD o=0;
int ol=0;
file.Open("ts.txt",CFile::modeRead);
while(file.ReadString(sss))
{
ol++;
if(ol>1)//讀兩次就不讀了.
break;
}
o=file.GetPosition();//記錄上次的結果(讀到哪了)
.................
file.Seek(o,0);//接著上回讀
while(file.ReadString(sss))
{
strcpy(ccc,sss);
AfxMessageBox(ccc);
}
}
這樣的命名叫人看了好難受的 又是o
又是0
我 覺得要測試的 字符就是"\n, \r, \r\n, or EOF. "
就可以了
( wshust 發表于 2004-3-4 21:28:00)
上面lichihang,我試了一下,事實并不是如你所說的那樣讀到空行就停了,而是一直讀下去呀!! ( pamir 發表于 2004-2-9 8:31:00)
我不同意這個回答!
因為CStdioFile::ReadString()返回NULL的條件是遇到文件尾或者一個空行,所以如果說txt文件的某一條記錄后面連續出現了若干條空行,那么CStdioFile::ReadString()函數也會返回NULL,這樣文件并沒有讀取完畢! ( lichihang 發表于 2003-12-29 8:26:00)
刪除目錄及目錄下所有文件與子目錄
(Hermess發表于2002-5-24 22:10:27)
VC++只提供了刪除一個空目錄的函數,而在實際應用中往往希望刪除其下有很多子目錄與文件的目錄。為了實現這一功能,我編寫了DeleteDirectory 函數,它可以實現這一功能。
函數原型:BOOL DeleteDirectory(char *DirName);
返回值:成功刪除時返回TRUE,否則返回FALSE
參數DirName為要刪除的目錄名,必須為絕對路徑名,如“c:\\temp"。
函數定義如下:
BOOL DeleteDirectory(char *DirName)
{
CFileFind tempFind;
char tempFileFind[200];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[200];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemovwDirctory(DirName))
{
MessageBox(0,"刪除目錄失敗!","警告信息",MK_OK);
return FALSE;
}
return TRUE;
}
搜集--- 關于“按行讀取”“查找特定字符串”“替換字符串”操作
氣死了,剛剛誤操作,畫了一半的表格全都沒了。哼哼,沒有好興致說些有趣的話了,愛看不看,愛聽不聽。氣死了!偏偏還要在網頁上寫,還要不保存!
不說上午的事情了,
直奔主題氣死!
關鍵詞:文本文件 按行讀取 查找特定字符串 替換字符串
C/C++ VC/MFC
按行:fgets();getline(); StdioFile::ReadString(buf)CArchive::ReadString(CString &str)
查找:strstr();_tcschr();fseek() buf.Find(str)(buf是CString類型的)
替換:替換字符串
代碼:
CStringFile CLASS
我用fopen打開一個txt文件,想查找某一字符串,找到這個字符串后,再讀取它對應行的
其他數據,請教大俠指點小弟如何去做,用什么函數。謝謝。
a. fopen過后,逐行讀入str, 用 strstr 判斷是否含有特定字符串. 例子:
FILE *fd=fopen("你要打開的文件","r+");
char tmpLine[200];
while(fgets(tmpLine,200,fd)!=NULL)
{
if( strstr(tmpLine,"你要找的字符串"))
{
printf("find the string!\n");
break;
}
memset(tmpLine,0,200);
}
free(tmpLine);
//從指定文件中提取指定字符串
CStrOP& CStrOP::GetSpecifyString(LPCTSTR szSpec, CArchive *ar, BOOL bMid, int iMid, int *pRow, int *pCol)
{
do
{
//讀取文件內容
if(ar)
{
//判斷是否到了文件最末
if(!ar->ReadString(*this))
{
//未找到找到字符串
if(pRow)
{
*pRow = 0;
}
if(pCol)
{
*pCol = 0;
}
(*this).Format("%s", "");
break;
}
}
//獲得需要查找的字符串所在行
if(pRow)
{
(*pRow)++;
}
//去掉空白字符
TrimLeft();
TrimRight();
//判斷是否已經找到需要的字串
if(Find(szSpec) >= 0)
{
//獲得需要查找的字符串所在列
if(pCol)
{
*pCol = Find(szSpec) + 1;
}
//判斷是否需要提取字符串
if(bMid)
{
//判斷提取字符串的規則,如果iMid為-1,則不論字串在任何位置,都可以
//進行提取;否則,字串必須在指定位置iMid時才可以提取
if(iMid == -1)
{
(*this).Format("%s", Mid(Find(szSpec) + lstrlen(szSpec)));
break;
}
else if(iMid >= 0)
{
if(Find(szSpec) == iMid)
{
(*this).Format("%s", Mid(iMid + lstrlen(szSpec)));
break;
}
}
}
}
else
{
if(!ar)
{
//未找到找到字符串
if(pRow)
{
*pRow = 0;
}
if(pCol)
{
*pCol = 0;
}
(*this).Format("%s", "");
break;
}
}
} while(1);
return *this;
}
其中CStrOP是我新建的類,函數聲明為
CStrOP& GetSpecifyString(LPCTSTR szSpec, CArchive *ar = NULL, BOOL bMid = TRUE, int iMid = 0, int* pRow = NULL, int* pCol = NULL);
這個函數能實現在指定文本格式的文件中進行特定字符串的查找、提取、定位等工作,其中參數CArchive ar初始化為:
CFile file(cMyTxtFile,CFile::modeRead)
CArchive ar(&file, CArchive::load)
回復 更多評論