标题:问一道C++文件的题
只看楼主
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
 问题点数:0 回复次数:15 
问一道C++文件的题
原题是
将文件中各行的第21个字符复制到新文件,如果该行没有21个字符,则复制该行的最后一个字符。
while(in.get(achar))
{
int c++;
if(achar=='\n')
{c=0;}
if(c==21)
{
out.put(achar);
}
}
前两个功能我做出来了,可是当该行不足21个字符时复制最后一个字符的功能不知道如何实现,请高手指点
搜索更多相关主题的帖子: 文件 字符 achar get 
2006-06-25 18:15
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
for(int c=0;in.get(achar);c++)
{
char temp;static bool found=true;
if(achar=='\n'){c=0;found=true;}
if(achar!='\n'&&c<=21)temp=achar;
else
{
if(found){out.put(temp);found=false;}
}
}
或许这可以

[此贴子已经被作者于2006-6-26 13:43:49编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-25 19:04
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
得分:0 

谢谢,我明白你的意图,就是当读到回车的时候进行判断C<=21,然后写入
不过这样会有个BUG ,如果该文件有3行
如 123
456
789
由于第三行并没有回车输入,你只能将3 6 写入文件,也就是说该程序写不了没有回车的一行.
你有什么改进的方法吗?谢谢

2006-06-26 10:51
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
for(int c=0,bool finish=false;!finish;c++)
{
char achar,temp; static bool found=true;
if(!in.get(achar))finish=true;
if(achar=='\n'||achar==EOF){c=0;found=true;}
if(achar!='\n'&&c<=21&&achar!=EOF)temp=achar;
else
{
if(found){out.put(temp);found=false;}
}
}

[此贴子已经被作者于2006-6-26 13:44:07编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-26 11:10
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
得分:0 

貌似这么写不行吧
D:\C++平台控制台程序\ewr.cpp(23) : error C2146: syntax error : missing ',' before identifier 'finish'

D:\C++平台控制台程序\ewr.cpp(25) : error C2146: syntax error : missing ';' before identifier 'found'
D:\C++平台控制台程序\ewr.cpp(25) : error C2065: 'found' : undeclared identifier
有3个错误,程序也没有什么没有定义,可能FOR语句有问题

2006-06-26 11:26
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
那你试着把bool finish=false;放循环上面去试试

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-26 11:57
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
得分:0 

改了,可是还是算不了没有回车的那一行,以下是原代码,你试一下.
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

void main()
{
ifstream in;
in.open("c:\\text.txt");
if(!in)
{
cerr<<"\aCan't open the File"<<endl;
exit(100);
}
ofstream out;
out.open("c:\\text1.txt");
if(!out)
{
cerr<<"\aCan't whrte the File"<<endl;
exit(102);
}

bool finish=false;
for(int c=1;!finish;c++)
{
char achar,temp;
static bool found=false;
if(!in.get(achar))finish=true;
if(achar=='\n'||achar==EOF){c=1;found=true;}
if(achar!='\n'&&c<=21&&achar!=EOF)temp=achar;
else
{
if(found){out.put(temp);found=false;}
}
}

}

2006-06-26 12:53
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

恩,的确是这样,目前不知道哪里有问题,aogun说说看


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-26 17:54
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 

我讨厌get方法和一个一个char的分析,你们试试下面这个(要回家了,写得比较急,可能有错误):
[CODE]void main()
{
ifstream in;
in.open("c:\\text.txt");
if(!in)
{
cerr<<"\aCan't open the File"<<endl;
exit(100);
}
ofstream out;
out.open("c:\\text1.txt");
if(!out)
{
cerr<<"\aCan't whrte the File"<<endl;
exit(102);
}

bool finish=false;
char achar[80];
int iLength;
while(!in.eof())
{
memset(achar, 0, sizeof(achar));
in.getline(achar, 80); //直接读一行出来
iLength = strlen(achar);
if (iLength >= 21) //判断这一行的字符数是否大于或者等于21个
{
out<<achar[20]<<endl; //输出第21个字符
}
else
{
if (--iLength >= 0) //如果字符数为1到20,则输出最后一个
out<<achar[iLength]<<endl;
else //否则改行为空行,直接输出换行符
out<<endl;
}
}

}[/CODE]



世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-26 19:07
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
....这样要多分配内存列,呵呵~!用get和put只需要一个变量的内存

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-26 19:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-74740-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.736546 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved