免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1685 | 回复: 4
打印 上一主题 下一主题

[C++] 将xml文件看做是文件操作,发生了一些怪异的情况! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 10:12 |只看该作者 |倒序浏览
1、将一组字符串儿拼接成一个xml消息的节点,之前的那个-<node></node>的“-”该用什么方法拼接?
我用strcpy(node,"-<"),结果成了这样

<node></node>,该用什么方法改回-<node></node>这种形式啊?谢谢各位
2、在程序中将xml文件看做一个文件操作,即每次写入时,在文件的准确长度减去strlen("</ptg-log>")的长度的位置处插入一个事先拼接好的xml节点。问题是,我可以写入节点,但是除了第一次是正确写入外,其他拼接后的xml节点信息全部不正确,两个节点信息之间出现大量的空格。程序如下:

#include <sys/fcntl.h>
#include <sys/unistd.h>
#include <sys/file.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
enum logtype{operation,error,excep};

struct flock* file_lock(short type, short whence)
    {
        static struct flock ret ;
        ret.l_type = type ;
        ret.l_start = 0 ;
        ret.l_whence = whence ;
        ret.l_len = 0 ;
        ret.l_pid = getpid() ;
        return &ret ;
    }
int charNum=0,xmlfilefd;//统计文件程度和xmlfile 定义为全局变量。
class createXML
{
private:
//    int xmlfilefd;
    FILE *pFile;
    char xmlbuf[];
public:
    void createXMLHead();
    int charNumber();
    void createXMLNode(enum logtype lt,char messagedescription[200]);
    void closeXMLFile();
};
void createXML::createXMLHead()
{
    strcpy(xmlbuf,"<?xml version=\"1.0\"?>\n<ptg-log>\n</ptg-log>");

    xmlfilefd = open("/root/xmltest/ptg_log.xml",O_WRONLY|O_CREAT,0644);
    if(xmlfilefd<0)
    {
        perror("open xml file failed!");
    } else {
    cout<<"xml头文件创建成功!"<<endl;
    write(xmlfilefd,xmlbuf,strlen(xmlbuf));
    close(xmlfilefd);
    }
}
int createXML::charNumber()
{
//以流的方式打开文件,统计文件中字符的个数
    FILE *pFile = fopen( "/root/xmltest/ptg_log.xml", "r" );
           char ch;
    cout<<"ch equals  ";
           while ( (ch = getc( pFile )) != EOF )
           {
    charNum++ ;
    cout<<ch;
           }
    cout<<endl;
//计算结束
    fclose( pFile );
xmlfilefd = open("/root/xmltest/ptg_log.xml",O_WRONLY|O_CREAT,0644);
return charNum;
}
void createXML::createXMLNode(enum logtype lt,char messagedescription[200])
{

cout<<"createXML begin   charNum value is : "<<charNum<<endl;
//取得当前时间
       time_t t = time(0);
       char tmp[30];
       strftime( tmp, sizeof(tmp), "%Y-%m-%d %X",localtime(&t) );
       string ss=tmp;
       string s;
       s= ss.substr(0,16);

//开始创建xml节点信息
       char node[220];
       char nodeName[20];
       //char nodeDescription[200];
       char nodeEnd[20];
       strcpy(nodeEnd,">\n</ptg-log>");
       switch(lt)
       {
       case 0:
           strcpy(nodeName,"operation");
           break;
       case 1:
           strcpy(nodeName,"error");
           break;
       case 2:
           strcpy(nodeName,"excep");
           break;
       default:
           cout<<"please choose a right node name"<<endl;
           break;
       }
//拼接成一个xml节点
       strcpy(node,"<");
       strcat(node,nodeName);
       strcat(node," time=\"");
       strcat(node,s.c_str());
       strcat(node,"\">");
       strcat(node,messagedescription);
       strcat(node,"</");
       strcat(node,nodeName);
       strcat(node,nodeEnd);
//给文件加上操作锁
fcntl(xmlfilefd, F_SETLKW, file_lock(F_WRLCK, SEEK_SET));

int nodelength=strlen(node);
charNum = charNum-10;
lseek(xmlfilefd,charNum,SEEK_CUR);
write(xmlfilefd,node,strlen(node));

//对文件解锁操作
fcntl(xmlfilefd, F_SETLKW,file_lock(F_UNLCK,SEEK_END));
strcpy(node," ");
}

void createXML::closeXMLFile()
{
    cout<<"end this file charNum value is  :   "<<charNum<<endl;
    close(xmlfilefd);
}

class createNodeMessage
{
public:
    char operationmessage[200];
    char errormessage[200];
    char exceptionmessage[200];
  void callcreateXMLNode();
};

void createNodeMessage::callcreateXMLNode()
{
    createXML callmessage;
    enum logtype log;
    for(int i=0;i<2;i++)
    {
        switch(i%3)
        {
        case 0:
            log=operation;
            strcpy(operationmessage,"this is an operation message !");
            callmessage.createXMLNode(log,operationmessage);
            break;
        case 1:
            log=error;
            strcpy(errormessage,"this is an errormessage message !");
            callmessage.createXMLNode(log,errormessage);
            break;
        case 2:
            log=excep;
            strcpy(exceptionmessage,"this is an exceptionmessage message !");
            callmessage.createXMLNode(log,exceptionmessage);
            break;
        default:
            cout<<"no input param"<<endl;
         break;
        }
    }
}
int main()
{
    createXML createxml;
    createxml.createXMLHead();
    createxml.charNumber();
    createNodeMessage message;

    //createxml.createXMLNode(l,message.operationmessage);

    message.callcreateXMLNode();
    createxml.charNumber();
    createxml.closeXMLFile();
return 0;
}

结果是这样的:


<?xml version="1.0"?>
<ptg-log>
<operation time="2009-04-27 10:07">this is an operation message !</operation>
</ptg-log>                      <error time="2009-04-27 10:07">this is an errormessage message !</error>
</ptg-log>//这段节点信息本来应该插在蓝色的信息之前,但现在位置弄乱了!

各位辛苦了!谢谢指教!!

论坛徽章:
0
2 [报告]
发表于 2009-04-27 17:34 |只看该作者
那个是做试验时加的。

论坛徽章:
0
3 [报告]
发表于 2009-04-27 19:06 |只看该作者
1、将一组字符串儿拼接成一个xml消息的节点,之前的那个-<node></node>的“-”该用什么方法拼接?
我用strcpy(node,"-<"),结果成了这样

<node></node>,该用什么方法改回-<node></node>这种形式啊?谢谢各位

===============
从你这段代码看不出什么
strcpy(node,"-<");
printf(note);
应该输出-<才对
不知道你的结果怎么来的

论坛徽章:
0
4 [报告]
发表于 2009-04-28 09:40 |只看该作者
以上问题已经解决,谢谢大家!

论坛徽章:
0
5 [报告]
发表于 2009-04-28 09:41 |只看该作者

回复 #4 皇家救星 的帖子

那个输出是在生成的xml文件中的输出,在控制台上输出的结果跟你说的是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP