CString.Right的问题,真要把我给气疯了,大家帮忙看看。

cmoth 2002-04-03 12:34:48
程序如下,就是把IDC_FILENAME所指的文件中结尾为;号的行删掉,

void CGetValClsDlg::OnOK()
{
CString sLineContent;
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];

GetDlgItemText(IDC_FILENAME,szPathOrig,_MAX_PATH);
ofstream ofile(szPathOrig,ios::app);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("gzz"), 0, szPathClone);
if (0==CopyFile(szPathOrig, szPathClone, FALSE))
return;
ifstream tempfile(szPathClone);
while (0==tempfile.eof())
{
tempfile.getline ((LPSTR)(LPCTSTR)sLineContent,_MAX_PATH);
sLineContent.TrimRight(" ");
if (sLineContent.Right(1)) //<-----------------------
{
ofile <<sLineContent<<"\n";
}
}
MessageBox("fffffff");

}

现在的问题是打标注一行sLineContent.Right(1)返回值就是等于sLineContent,例如如果sLineContent是"Window;",那么sLineContent.Right(1)就是"Window;",这到底是怎么回事?哎,我现在都快被这个玩艺给气爆了!各位帮忙看看是什么地方的问题
...全文
755 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlb2000 2002-04-03
  • 打赏
  • 举报
回复
sLineContent.TrimRight();
sLineContent=sLineContent.Right(1);
if (sLineContent) //<-----------------------
{
ofile <<sLineContent<<"\n";
}
cmoth 2002-04-03
  • 打赏
  • 举报
回复
ahao(天·狼·星星)

确实,谢谢你了,hoho
ahao 2002-04-03
  • 打赏
  • 举报
回复
// tempfile.getline ((LPSTR)(LPCTSTR)sLineContent,_MAX_PATH);
改成
char buf[1024];
tempfile.getline (buf,1024);
sLineContent = buf;
即可

象tempfile.getline ((LPSTR)(LPCTSTR)sLineContent,_MAX_PATH);
这样的用法根本就是错误的,你跟进源码看看就明白了
shenleav 2002-04-03
  • 打赏
  • 举报
回复
是这样:
if(sLineContentRight(1)!=_T(";"))
{
...
}
shenleav 2002-04-03
  • 打赏
  • 举报
回复
这样试一下:
if(sLineContentRight(1)!=_T(";")
{
....
....
}
cmoth 2002-04-03
  • 打赏
  • 举报
回复
#include <afx.h>
#include <iostream.h>
#include <fstream.h>

void main(int argc,char *argv[])
{
CString sLineContent;
CString sss;
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
if (argc==2)
{
strcpy(szPathOrig,argv[1]);
ofstream ofile(szPathOrig,ios::app);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("gzz"), 0, szPathClone);
if (0==CopyFile(szPathOrig, szPathClone, FALSE))
return;
ifstream tempfile(szPathClone);
while (0==tempfile.eof())
{
tempfile.getline ((LPSTR)(LPCTSTR)sLineContent,_MAX_PATH);
sLineContent.TrimRight(" ");

cout <<"sLineContent:\"" <<sLineContent<<"\""<<endl;
cout <<"sLineContent.Right(1):\"" <<sLineContent.Right(1)<<"\""<<endl;

if (sLineContent.Right(1)!=";")
{
ofile <<sLineContent<<"\n";
}
}
}


}
可以试试这段程序,结果就是不对啊!
cmoth 2002-04-03
  • 打赏
  • 举报
回复
ydogg(灰毛兔频频) ( )
对啊!但为什么在最上的那个程序里
if (sLineContent.Right(1)!=";")
语句sLineContent.Right(1)返回值就不对呢?哎.........yum
ydogg 2002-04-03
  • 打赏
  • 举报
回复
to 楼上兄弟
你刚才贴的例字当然是正确的
s.Right (1)!="k" 这是判断的返回值而非s本身

Right操作并不修改本身,只是返回一个字符串而已
cmoth 2002-04-03
  • 打赏
  • 举报
回复
对不住,才发现标注行错了,应该是这样:
if (sLineContent.Right(1)!=";")
请大家再看看
cmoth 2002-04-03
  • 打赏
  • 举报
回复
XLB2000() ( )

#include <afx.h>
#include <iostream.h>

void main()
{
CString s("jgkghkhk ");
s.TrimRight (" ");
cout <<s<<endl;
cout <<s.Right(1)<<endl;
if (s.Right (1)!="k")
cout <<"gkhkhk"<<endl;
}

以上s.Right(1)返回的指就是对的,另外我是要删除行结尾是;号的行,你改的好像并不是我要求的,请帮忙再看看。主要是什么原因会导致Right出错?
sclzmbie 2002-04-03
  • 打赏
  • 举报
回复
你要判断字符串是否为空,可以用CString::IsEmpty(),或者CString::GetAt(length)。在DOS时代常常自己找结尾的0来判断字符串,现在有很多可以用的类了。另外你可以继承CString,然后写一些你自己能用得上的成员函数。

关于CString::Right(),你仔细看看MSDN吧!
xunknown 2002-04-03
  • 打赏
  • 举报
回复
同意XLB2000()的说法!
cmoth (容量够大) 的错误在于哪里是一目了然了的!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧