2011-10-12 114 views
-3

嗨我有一个关于下面的代码的问题。我将复制一个char字符串,将其从文件读出到矢量中并在屏幕上打印出这个矢量。该程序将该字符串从文本文件中复制出来,但该向量仅给出该向量的最后一个元素。我在这里错了什么? :矢量打印出错误的值

#include <fstream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <string.h> 
#include <sstream> 
#include <vector> 
#include "mbusread.h" 
using namespace std; 


int main() 
{ 

    int dev_nr; 
    int anzahl; 
    ifstream addr; 
    string buffer; 
    string dev_no; 
    stringstream devss; 
    char *reg_no_c = new char [buffer.length()+1]; 
    char *start_reg_c = new char [buffer.length()+1]; 
    char *adresse_c = new char [buffer.length()+1]; 
    char *id_c = new char [buffer.length()+1]; 
    char *zeit_c = new char [buffer.length()+1]; 

    addr.open("Addr.xml", ios::in); //Addressendatei auslesen 
    do //Anzahl suchen 
    { 
     getline(addr, buffer); 
    } while(strcmp (buffer.c_str(), "<Anzahl>")!=0); 
     getline(addr, buffer); 

     stringstream bufferss(buffer); 
     bufferss >> anzahl; 
     anzahl++; 

     vector<const char *> ip(anzahl); 
     vector<const char *> start_reg(anzahl); 
     vector<const char *> reg_no(anzahl); 
     vector<const char *> id(anzahl); 
     vector<const char *> zeit(anzahl); 


    for(dev_nr=1;dev_nr<anzahl;dev_nr++) 
    { 
     addr.seekg(ios::beg); 
     devss << "<dev" << dev_nr << ">"; 
     dev_no = devss.str(); 
     devss.str(""); 
     devss.clear(); 

     do { 
      getline(addr, buffer); 
      if(addr.eof()) 
      { 
      break; 
      } 
      } while (strcmp (buffer.c_str(),dev_no.c_str()) != 0); 

     do // ip suchen 
     { 
      getline(addr, buffer); 
     }while(strcmp (buffer.c_str(), "<ip>")!=0); 
     getline(addr, buffer); 
     if(addr.eof()) 
     { 
     break; 
     } 
     strcpy(adresse_c, buffer.c_str()); // ip einlesen 
     ip[dev_nr - 1] = adresse_c; 
     cout << ip[dev_nr - 1] << endl; 

     do // start_reg suchen 
     { 
      getline(addr, buffer); 
     }while(strcmp(buffer.c_str(), "<start_reg>")!=0); 
     if(addr.eof()) 
     { 
     break; 
     } 
     getline(addr, buffer);    //Schreibt Startregister in Daten 
     strcpy(start_reg_c, buffer.c_str()); // ip einlesen 
     start_reg[dev_nr - 1] = start_reg_c; 
     cout << start_reg[dev_nr - 1] << endl; 

     do // reg_no suchen 
     { 
      getline(addr, buffer); 
     }while(strcmp(buffer.c_str(), "<reg_no>")!=0); 
     if(addr.eof()) 
     { 
     break; 
     } 
     getline(addr, buffer);    //Schreibt die Anzahl der ausgelesenen Register in Daten 
     strcpy(reg_no_c, buffer.c_str()); // ip einlesen 
     reg_no[dev_nr - 1] = reg_no_c; 
     cout << reg_no[dev_nr - 1] << endl; 

     do // ID suchen 
     { 
      getline(addr, buffer); 
     }while(strcmp(buffer.c_str(), "<ID>")!=0); 
     if(addr.eof()) 
     { 
     break; 
     } 
     getline(addr, buffer);    //Schreibt die ID des Sensors in Daten 
     strcpy(id_c, buffer.c_str()); // ip einlesen 
     id[dev_nr - 1] = id_c; 
     cout << id[dev_nr - 1] << endl; 

     do 
     { 
      getline(addr, buffer); 
     }while(strcmp(buffer.c_str(), "<Time>")!=0); 
     if(addr.eof()) 
     { 
      break; 
     } 
     getline(addr, buffer); 
     strcpy(zeit_c, buffer.c_str()); // ip einlesen 
     zeit[dev_nr - 1] = zeit_c; 
     cout << zeit[dev_nr - 1] << endl; 

    } 

    for(int i = 0; i < anzahl; i++) 
    { 
     cout << "ip " << ip[i] << endl; 
     cout << "id " << id[i] << endl; 
     cout << "start_reg " << start_reg[i] << endl; 
     cout << "reg_no " << reg_no[i] << endl; 
     cout << "zeit " << zeit[i] << endl; 
    } 
} 
+0

你能减少代码到问题的本质吗? –

+0

请提供一些输入xml文件。 – arne

+7

调试它。找出它开始出错的地方。然后只发布相关的代码。 –

回答

0

你的问题就在顶部开始代码

string buffer; 
string dev_no; 
stringstream devss; 
char *reg_no_c = new char [buffer.length()+1]; 
char *start_reg_c = new char [buffer.length()+1]; 
char *adresse_c = new char [buffer.length()+1]; 
char *id_c = new char [buffer.length()+1]; 
char *zeit_c = new char [buffer.length()+1]; 

一这点buffer是空的,所以length()返回0,你的C字符串分配只是一个字节。

1

不是一个真正的答案,但我的意见是,你应该真的学会如何阅读一个XML文件。你的代码太复杂了,尽管它真的只是试图“破解”一个xml文件,很多人会觉得它不值得去纠正它。