请教C++里利用fstream来逐行控制读取和写入TXT的方法。

有一个TXT文件,里面的信息是一行一行,而且每行是什么都是固定的。然后用fstream来操作它。怎么实现,专门只读取某一行,或者只修改某一行这样的功能,或者查找某个字段在... 有一个TXT文件,里面的信息是一行一行,而且每行是什么都是固定的。
然后用fstream来操作它。
怎么实现,专门只读取某一行,或者只修改某一行这样的功能,或者查找某个字段在哪一行,这些功能。
比如只想读第三行的内容,要怎么读呢。用String字符串替换文件中的第三行的内容。再就是查找有“abc”这字段的一行是哪一行,这些都要怎么实现……
如果知道的话,麻烦告诉一下,谢谢了。
展开
 我来答
TERENCEYAO
2009-12-26
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
我想剑应该会宣告跟使用副程式吧

当然记得要引入
#include <fstream.h>
#include <stdio.h>
#include <string.h>

我写了一个程式给你做为参考
也经过测试,是可以成功的

!!请注意所有阵列的大小!!
!!资料量不可超过阵列的大小!!
!!阵列的大小当然越大越好!!

◎假设有个档案叫123.txt档,其内容为:
Label_001:Zoharwolf
Label_002:TERENCEYAO
Label_003:DragonKing
Label_004:Apple
Label_005:Wolf
Label_006:XD

因为最进自己实验室也刚好要写网路封包字串解析
就顺道练习一下XD

思路是file读取时把每换行的动作变成...
换行动作的格式化输出型式" \r\n "
而进一步解析字串内容

(以下内容主要是以主程式跟副程式的内容为主)

◎主程式的部份:
int main()
{
char gstr[200];
char data[200];
char pser[200];
int row;

memset(data,0,sizeof(data));
memset(gstr,0,sizeof(gstr));
ifstream fin;
fin.open("123.txt");
do{
strcat(data,gstr);
strcat(data,"\r\n");
fin>>gstr;
}while(!fin.eof());
fin.close();

// 此时pser所存放的就是第3行的资料
// 所以pser所存放的就是Label_003:DragonKing
Reading_Row(3, data, pser);

// 查找某字段在哪一行之例子(1)::此时row为4
row=Searching_Row(data, "Apple");

// 查找某字段在哪一行之例子(2)::此时row会是为3
row=Searching_Row(data, "Dragon");

// 此时123.txt的第3行的字串已经变成Label_003:Fstream
Replacing_Row(3, data, "Label_003:Fstream");

return 0;
}

◎副程式Reading_Row的部份:
//====================================================================
// 搜索txt文字档中 第N行的资料
//----------------------------------------------
// Reading_Row(要搜索的行数, 要搜索资料的buffer, 存放搜索该行资料的buffer)
//====================================================================
int Reading_Row(int row, char *Buf, char *Msg)
{
int i,j=0,count=-1;
memset(Msg,0,sizeof(Msg));

for(i=0; Buf[i]!=0; i++,j++)
{
Msg[j]=Buf[i];
if(Buf[i]=='\n' && Buf[i-1]=='\r')
{ count++;
if(count==row)
{ Msg[j-1]=0;
return row;
}
j=-1;
}
}
return 0;
}

◎副程式Searching_Row的部份:
//====================================================================
// 查找某个字段在哪一行
//----------------------------------------------
// Searching_Row(要搜索资料的buffer, 搜索的字段)
//====================================================================
int Searching_Row(char *Buf, char *Msg)
{
int i,j,len=0,count=0;
int compareLen=0;

for(i=0; Msg[i]!=0; i++)
len++;

for(i=0; Buf[i]!=0; i++)
{
for(j=0; Msg[j]!=0; j++)
{ if(Buf[i+j]==Msg[j])
compareLen++;
}
if(compareLen==len)
return count++;
else
compareLen=0;

if(Buf[i]=='\n' && Buf[i-1]=='\r')
count++;
}
return 0;
}

◎副程式Replacing_Row的部份:
//====================================================================
// 第N行替换成某字串 + 改变储存该txt文字档
//----------------------------------------------
// Replacing_Row(第N行是要替换的, 读取资料的buffer, 替换字串)
//====================================================================
int Replacing_Row(int row, char *Buf, char *Msg)
{
int i,j,len=0,count=1;
char newbuf[1000];
memset(newbuf,0,sizeof(newbuf));

for(i=0; Msg[i]!=0; i++)
len++;

for(i=2,j=0; Buf[i]!=0; i++,j++)
{
if(count==row)
{ for(int n=0; Msg[n]!=0; n++)
newbuf[j+n]=Msg[n];

newbuf[j+n]='\r';
newbuf[j+n+1]='\n';
j+=len; j+=1;

do{
i++;
}while(Buf[i]!='\n' && Buf[i-1]!='\r');
}
else
newbuf[j]=Buf[i];

if(Buf[i]=='\n' && Buf[i-1]=='\r')
count++;
}

ofstream fout;
fout.open("123.txt");
fout<<newbuf;
fout.close();

return 0;
}

参考资料: 自己(龙仔叔= =)

wdytoya
2009-12-25 · TA获得超过1078个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:234万
展开全部
奉劝你不要这么做。
首先流控制是很复杂的,一不小心就可能失去控制。
其实你放在文件里的数据一般作为原始数据是不能动的,毕竟文本文件不像数据库那样是容易维护的,一旦改动就很难恢复了。
所以一般不做在原文件上直接替换或者改动数据这种事情,除非你用的数据库来保存,如果在文本文件上操作的话建议你新建一个文本文件,将要替换的内容之前的数据先复制到新文件中,再写入替换后的那行内容,再将后面的内容再复制过来。然后再用新文件覆盖原文件。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1a0c9ec
推荐于2017-10-04 · TA获得超过862个赞
知道小有建树答主
回答量:245
采纳率:0%
帮助的人:346万
展开全部
基本的操作你都会吧?
我对此了解也不是那么多,但是有一个函数应该完成你要求的功能
File.getline(arr,10,'o');
他的意思是读取满足下面条件则停止,你可以自己设定条件
10表示已经读取10个字符则停止,你这个情况可以不设定次条件
‘o’遇到字母"o"停止
出现新一行,停止,也就是说每次读取一行。
那么想要读取第几行和替换你自己也应该知道怎么做了吧。
至于查找逐行读取然后比较就ok了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
而庅没页65
推荐于2017-09-14 · TA获得超过876个赞
知道小有建树答主
回答量:295
采纳率:100%
帮助的人:141万
展开全部
#include<iostream>
#include<fstream>
using namespace std;
int main(){
int i=1;
char c[1000];
ifstream ifile1("D:\\a.txt"); //在D盘建立.txt文件
ifstream ifile2("D:\\b.txt");
ofstream ofile("D:\\c.txt");
while(!ifile1.eof()){
ifile1.getline(c,999);
ofile<<c<<endl;
}
while(!ifile2.eof()){
ifile2.getline(c,999);
ofile<<c<<endl;
}
ifile1.close(); //关闭文本
ifile2.close();
ofile.close();
return 0;
}
2、
#include <iostream>
#include <fstream>
using namespace std;
bool isalph(char);
int main()
{
ifstream in("D:\\d.txt");
if(!in)
{
cerr<<"not open \n";
return 1;
}
int line=0,word=0,i;
char c[1000];
while(!in.eof())
{
in.getline(c,1000);
line++;
i=0;
while(c[i]!=0)
{
if(isalph(c[i]))
{
word++;
}
i++;
}
}
cout<<"Line="<<line<<endl;
cout<<"word="<<word<<endl;
return 0;
}
bool isalph(char c)
{
return ((c>='a'&&c<='z')||(c>='A'&&c<='Z')); //返回值内容
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
houjiatao2009
2009-12-25
知道答主
回答量:20
采纳率:0%
帮助的人:0
展开全部
定义一个vector<string>类型的变量 就可以解决你的问题.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式