tham gia congdongC gửi 1 bài nhờ các bác cho ý kiến, em là dân lập trình cho microcontroller mới chuyển sang lam ứng dụng C/C++ nhờ các bác chỉ giáo
parse của em hơi củ chuối, các bác có cách nào hay thì cho ý kiến
thanks
run DEV-C++
commandline: parse.exe file.txt
main.h
C++ Code:
  1. #ifndef _MAIN_H_
  2. #define _MAIN_H_
  3. #include <stdio.h>
  4. #include <string>
  5. #include <vector>
  6. #include <conio.h>
  7. using namespace std;
  8. void parse_var_path(string s,string &sub_str,long &var);
  9. void parse_bool(string s,string &str_var,string &str_bool);
  10. #endif
/////////////////////////
parse_line.cpp
C++ Code:
  1. #include <stdio.h>
  2. #include <string>
  3. #include <vector>
  4. #include <iostream>
  5. #include <conio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. using namespace std;
  9. void parse_var_path(string s,string &sub_str,long &var)
  10. {
  11.     string::size_type loc,loc1,loc2,loc3;
  12.     string tmp_num,tmp_str;
  13.     char char_var[100];
  14.     string sub_num;
  15.     for (int i=0;i<s.size();i++)
  16.     {
  17.         loc1=s.find("   ",0);
  18.         if( loc1 != string::npos ) s.erase(loc1,1);
  19.     }
  20.     loc = s.find(" ", 0 );
  21.     tmp_num = s.substr(loc+1);
  22.     tmp_str=s.substr(0,loc);
  23.    
  24.     for (int j=0;j<s.size();j++)
  25.     {
  26.         loc2=tmp_num.find(" ",0);
  27.         if( loc2 != string::npos ) tmp_num.erase(loc2,1);
  28.         loc3=tmp_str.find(" ",0);
  29.         if( loc3 != string::npos ) tmp_str.erase(loc3,1);
  30.     }
  31.     sub_num=tmp_num;
  32.     sub_str=tmp_str;
  33.    for(int i=0;i<sub_num.size();i++) char_var[i]=sub_num[i];
  34.    var=atol(char_var);
  35. }
  36. void parse_bool(string s,string &str_var,string &str_bool)
  37. {
  38.     string::size_type loc,loc1,loc2,loc3;
  39.     string tmp_var,tmp_bool;
  40.     for(int i=0;i<s.size();i++)
  41.     {
  42.         loc1=s.find("   ",0);
  43.         if( loc1 != string::npos ) s.erase(loc1,1);
  44.     }
  45.     loc = s.find(" ", 0 );
  46.     tmp_bool = s.substr(loc+1);
  47.     tmp_var=s.substr(0,loc);
  48.     for (int j=0;j<s.size();j++)
  49.     {
  50.         loc2=tmp_bool.find(" ",0);
  51.         if( loc2 != string::npos ) tmp_bool.erase(loc2,1);
  52.         loc3=tmp_var.find(" ",0);
  53.         if( loc3 != string::npos ) tmp_var.erase(loc3,1);
  54.     }
  55.     str_bool=tmp_bool;
  56.     str_var=tmp_var;
  57. }

////////////////////////
main.cpp
C++ Code:
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <string>
  5. #include <vector>
  6. #include <conio.h>
  7. #include <string.h>
  8. #include "main.h"
  9. using namespace std;
  10. int main(int argc, char *argv[])
  11. {
  12.    
  13.     vector<string> tmp_path,tmp_var,tmp_bool,tmp_str,tmp_num;
  14.     string test,s;
  15.     string::size_type loc1,loc2,loc3;
  16.     int i = 0; // For line number
  17.     long num=0;
  18.     string sub_str,s_var,s_bool;
  19.     FILE *config;
  20.    char str[200],str1[200];
  21.    ////////////////////////
  22.    if (argc !=2)
  23.     {
  24.        cout<<"parse"<<endl;
  25.        exit(0);
  26.     }
  27.     if (!(config = fopen(argv[1], "r")))
  28.     {
  29.        cout<<"error not open file"<<endl;
  30.         return 1;
  31.     }
  32.     while (fgets(str, sizeof(str), config))
  33.     {
  34.          char *end;
  35.          i++;
  36.         if (!str[0]) continue;
  37.         end = str + strlen(str) - 1;
  38.         while ((end >= str) && (*end == '\r' || *end == '\n' || *end == ' ' || *end == '\t'))
  39.         {
  40.             *end = 0;
  41.             if (end > str) end--;
  42.         }
  43.         int n=0;
  44.         while (str[n]==' ')
  45.         {
  46.               str[n]='\t';
  47.               n++;
  48.         }
  49.        
  50.         if (!str[0]) continue;
  51.         if (str[0] == '#') continue;
  52.         // clear    
  53.        
  54.         strcpy(str1, str);
  55.         strcpy(str, "");
  56.         for (int j=0;j<sizeof(str1);j++) s=s+str1[j];
  57.         loc1 = s.find( "File_Path", 0 );
  58.         if( loc1 != string::npos )
  59.             {
  60.                     if (strstr(str1," "))tmp_path.push_back(str1);
  61.                     else
  62.                     {
  63.                     cout<<"error in line "<<i<<endl;
  64.                     exit(0);
  65.                     }
  66.            }
  67.         loc2 = s.find( "Long_variable", 0 );
  68.         if( loc2 != string::npos )
  69.             {
  70.                     if (strstr(str1," "))tmp_var.push_back(str1);
  71.                     else
  72.                     {
  73.                     cout<<"error in line "<<i<<endl;
  74.                     exit(0);
  75.                     }
  76.            }
  77.         loc3 = s.find( "Bool_variable", 0 );
  78.         if( loc3 != string::npos )
  79.             {
  80.                     if (strstr(str1," "))tmp_bool.push_back(str1);
  81.                     else
  82.                     {
  83.                     cout<<"error in line "<<i<<endl;
  84.                     exit(0);
  85.                     }
  86.            }
  87.  
  88.        s.erase();
  89.     }
  90.         parse_bool(tmp_bool[1],s_var,s_bool);
  91.         parse_var_path(tmp_var[1],sub_str,num);
  92.         cout<<sub_str<<endl;
  93.         cout<<num<<endl;  
  94.         cout<<s_var<<endl;
  95.         cout<<s_bool<<endl;  
  96.   //  getch();
  97.     return 1;
  98. }
Text Code:
  1. ///////////////
  2. file.txt
  3. # Test File Version 0.1
  4.  
  5. # Variable 1 description
  6.     File_Path                   c:\Folder1\Subfolder1  
  7.  
  8.  
  9. #Variable 2 description
  10. # some description
  11.  
  12.     Long_variable1          123456
  13.  
  14. #Variable 3 description Yes/No
  15.    Bool_variable1                  Yes  
  16.  
  17. ############
  18.     File_Path c:\Folder1\Subfolder2  
  19.  
  20. ##############
  21.    Bool_variable2                       Yes  
  22.  
  23. #############
  24.                 Long_variable2 123