mysql低版本日期相加:
select opendate,openlong,INTERVAL openlong DAY + opendate from enter_status;

线上跑的sql:
select a.enterpriseid,b.name,a.opendate,a.openlong,INTERVAL a.openlong DAY + a.opendate as now from enter_status a,domain b where TO_DAYS(NOW()) - TO_DAYS(a.opendate) > a.openlong+7 and a.enterpriseid=b.enterpriseid
-----------------------------------------------------------------------------------------------------------------


select b.enterpriseid from enter_status a,enterprise b where TO_DAYS(NOW()) - TO_DAYS(a.opendate) > a.openlong+1 and a.enterpriseid=b.enterpriseid and b.expiration=0 and b.flag=2 limit 10;

状态为 b.expiration=1 b.flag=1 为过期,发提醒信件,但是还能正常收发信,但是正常企业0 2 也有过期的,是由于程序没有放置标志位!



mysql -uroot -p enterprise < in.txt > out.txt
准确的sql:
SELECT  b.enterpriseid,c.name,opendate,openlong,ADDDATE(a.opendate,a.openlong) from enter_status a,enterprise b,domain c where TO_DAYS(NOW()) - TO_DAYS(a.opendate) > a.openlong+1 and a.enterpriseid=b.enterpriseid and b.enterpriseid=c.enterpriseid and a.enterpriseid=c.enterpriseid limit 15

更准确:
select  b.enterpriseid,c.name,a.opendate,a.openlong,ADDDATE(a.opendate,a.openlong) from enter_status a,enterprise b,domain c where TO_DAYS(NOW()) - TO_DAYS(a.opendate) > a.openlong+1 and a.enterpriseid=b.enterpriseid and b.enterpriseid=c.enterpriseid and a.enterpriseid=c.enterpriseid and b.expiration=1 and b.flag=1 group by c.enterpriseid limit 15;

select a.enterpriseid,b.name,a.opendate,a.openlong,ADDDATE(a.opendate,a.openlong) from enter_status a,domain b where TO_DAYS(NOW()) - TO_DAYS(a.opendate) > a.openlong+7 and a.enterpriseid=b.enterpriseid;

导入时候第4行可能有错:改为:
`check` tinyint(4) NOT NULL default '1'
http://sqlserver.chinahtml.com/2005/mysql-1127986918405.shtml
#include <stdio.h>
#include <time.h>
using namespace std;

int main(void)
{
        time_t t;
        struct tm *x;

        time( &t );

        x = localtime(&t);
        printf("year=[%d]\n", x->tm_year+1900);
        printf("month=[%d]\n", x->tm_mon+1);
        printf("day=[%d]\n", x->tm_mday);
        printf("hour=[%d]\n", x->tm_hour);
        printf("min=[%d]\n", x->tm_min);
        printf("sec=[%d]\n", x->tm_sec);

        return 0;
}

cvs基本命令

WEB2.0 jack 2008-3-21 19:17
CVS基本命令      
goldway 发表于 2006-8-17 13:56:00

1. 检出源代码操作(cvs checkout)

    *
      将项目工作库目录取到个人工作库:cvs checkout dirname
    *
      将项目工作库中某个文件取到本地个人工作库:cvs checkout filename

2. 将文件同步到最新的版本(cvs update)


   开发人员每天开始工作前,请将项目工作库中的最新版本代码文件取到个人工作库中,养成"先同步,后修改"的习惯;
   更新单个文件:cvs update file_name
   更新目录:cvs update (不指定文件名,cvs将同步所有子目录下的文件)
   注意:第一次导出文件以后,就不是通过cvs checkout来同步文件了,而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步(添加,修改,删除)操作。


3. 文件提交(cvs commit)


   确认文件修改写入CVS库:cvs commit -m "注释内容" file_name;

   建议每次文件提交都只修改一个文件,以避免多个文件以同样注释commit到CVS库里了;每次确认提交时,请认真填写修改注释,以帮助其他开发人员了解修改的原因;



4. 添加(cvs add)


   添加某个目录操作:cvs add dir_name
   添加某个文件操作:cvs add new_file;
   然后确认添加文件并注释
    cvs commit -m "write some comments here"
  对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项按2进制文件方式导入,否则有可能出现文件被破坏的情况;
   cvs add -kb readme.doc

5. 删除文件(cvs rm)

  将某个文件物理删除操作:cvs remove -f file_name
  确认删除文件并注释cvs commit -m "why delete file"
  查看修改历史(cvs log)
  查看日志操作命令:
    cvs log file_name
    cvs log dirname
  操作历史命令:cvs history file_name
  查看版本操作:cvs status -v filename
  查看当前文件不同版本的区别:
    cvs diff file_name
    cvs diff -c file_name 查看对照的输出

6. 更名
   cvs里没有cvs move或cvs rename两个命令;
     可先移动老命名文件:cvs remove old_file_name;
     然后再增加新命名文件实现更名操作:cvs add new_file_name;
    例:将文件tt.c改名为test.c,具体操作如下
      mv tt.c test.c
      cvs remove -f tt.c
      cvs commit -m "remove for rename" tt.c
      cvs add test.c

7. 导出不带CVS目录的源代码文件
   每个开发目录下,CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。项目发布的时候一般不希望把文件目录还带着含有 CVS信息的CVS目录导出,这个一次性的导出过程使用cvs export命令,不过export只能针对一个TAG或者日期导出;
   cvs export -r release1 project_name;
   cvs export -D 20021023 project_name
   cvs export -D now project_name

8. 基线标识
   多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础;
   确认版本基线cvs tag release_1_0
   开始一个新的版本基线;
      cvs commit -r 2 标记所有文件开始进入2.0的开发
      cvs update -j release_1_0_patch_1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <strstream>
#include <fstream>  //ifstream fin("ent_list");
#include "../../entadmin_g/src/enterpriseManager.hpp"
char file_path1[1024]="/tmp/ent_not_exit.log";   //enterprise.domain的数据库select语句成功日志
char file_path2[1024]="/tmp/ent_failed_modify.log";   //enterprise.domain的数据库select语句失败日志
char file_path3[1024]="/tmp/ent_successful.log";  //enterprisemail.domain数据库的update修改成功日志
char file_path4[1024]="/tmp/startent_not_exit.log";  //enterprisemail.domain数据库的update语句修改失败日志
char file_path5[1024]="/tmp/startent_failed_modify.log";  //enterprisemail.domain蕌pdate语句修改失败日志
char file_path6[1024]="/tmp/startent_successful.log.log";  //enterprisemail.domain蕌pdate语句修改失败日志
int opt_type = 0;
char opt_file[1024];
void trim(string& str)
{
str.erase(str.find_last_not_of(' ')+1, string::npos);
str.erase(0, str.find_first_not_of(' '));
}

using namespace std;
int main(int argv,char * argc[])//main函数体
{  
  if(argv!=3)
  {
    cout << "_____________________请在ent_list文件放入企业ID_______________\n";
    cout << "|然后请传入参数? (0,1)                                         |\n";
    cout << "|传入1:ent_dated_restet 0 后跟关闭企业ID的文件      |\n";
    cout << "|传入0:ent_dated_restet 1 后跟打开企业的ID文件             \n";
    cout << "|______________________________________________________________|\n";
    cout << "|_你只要将要关闭或者打开的企业ID放到ent_list由1或者0来控制即可_|\n";
    cout << "| Warn:  连续一行一个企业ID(domain.enterpriseid)       \n";
    cout << "|Example:  scan_enterprise_dated 0 /tmp/open_enterprise.txt|\n";
    cout << "|______________________________________________________________|\n";
    return 0;
        
  }
  time_t t;
  struct tm *x;
  time( &t );
  x = localtime(&t);
  opt_type=atoi(argc[1]); //判断是关闭企业还是恢复企业  
  strcpy(opt_file,argc[2]); //传入的文本文件,读取企业ID  
  enterprise *_enterprise = new enterprise( );
  string errMsg;
  //读取文本
  FILE*   fp;  
    fp   =   fopen(opt_file,"r");  
  if   ( 0==fp )
  {   cout << "What you put the filename is not exist!\n ";
    return 0;
  }  
  fclose(fp);
  ifstream fin(opt_file);
  //读取结束
  ofstream fout1(file_path1,ios_base::app);//enterprise.domain的数据库select语句成功日志
  ofstream fout2(file_path2,ios_base::app);//enterprise.domain的数据库select语句失败日志
  ofstream fout3(file_path3,ios_base::app);//enterprisemail.domain数据库的update修改成功日志
  ofstream fout4(file_path4,ios_base::app); //enterprisemail.domain数据库的update语句修改失败日志
  ofstream fout5(file_path5,ios_base::app); //enterprisemail.domain数据库的update语句修改失败日志
  ofstream fout6(file_path6,ios_base::app); //enterprisemail.domain数据库的update语句修改失败日志
  string str;
  while(getline(fin,str))
  {    
    trim(str);//去掉读出的一行前后空格
    char buffer[1024];
    int str_to_int=atoi(str.c_str());  
    sprintf(buffer,"%d",str_to_int);  
    if(strcmp(str.c_str(),buffer)!=0)
    {  
      cout <<str<<"Have contain special character in one line,please check...\n";
      fout2 <<  x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<  "Enterpriseid:\t" <<str <<"\tHave contain special character in one line,please check...\n";
      continue;
    }  
    memset(buffer,0,1024);//销毁临时变量
    //判断是否是数字    
    if (!str.length())
    {
      printf("请检查一下你的./ent_list里面是否有空行...\n");
      return 0;
    }
  
    enterprise _enterprise1;
    string enterpriseID;
    enterpriseID=str;
    if ( !_enterprise1.getEnterpriseInfo( atoi( enterpriseID.c_str() ), errMsg ) )
    {
      cout <<errMsg;  
      fout1 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<enterpriseID<<"\t"<< errMsg<<"\n";
      delete _enterprise;
      return 0;
    }
    
    if ( opt_type == 0 )
    {

  
      if ( !_enterprise->stopDomain( atoi( enterpriseID.c_str() ), errMsg ) )
      {
        fout2 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<enterpriseID<<"\t"<< errMsg<<"\n";
        delete _enterprise;
        return 0;
      }
      fout3 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<enterpriseID<<"\t"<<"禁用企业成功"<<"\n";
      delete _enterprise;
      return 0;
    }

    if ( opt_type == 1 )
    {

      if ( !_enterprise->startDomain( atoi( enterpriseID.c_str() ), errMsg ) )
      {
        fout5 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<enterpriseID<<"\t"<< errMsg<<"\n";  
        delete _enterprise;
        return 0;
      }
      fout6<< x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<enterpriseID<<"\t" << errMsg<<"\n";  
      delete _enterprise;
      return 0;
    }
  

  }
  fin.close();
  fout1.close();
  fout2.close();
  fout3.close();
  fout4.close();
  fout5.close();
  fout6.close();

  }
  



all: scan_enterprise_dated.cgi
scan_enterprise_dated.cgi:
  g++ -o ./scan_enterprise_dated.cgi scan_enterprise_dated.cpp ../../db/rpcserver/common/bin/freebsd/rpcsql_g.a ../../entadmin_g/oldlib/libStrLib.a ../../db/rpcserver/qmail/bin/freebsd/ent_rpcserver_clnt.a ../../db/rpcserver/qmail/ini.o ../../entsystem/email/entaddress/bin/freebsd/ent_domain.o  ../../entsystem/email/entaddress/bin/freebsd/ent_add_tool.o -L../../entadmin/lib/ -I../../entadmin/lib/  
clean:
  rm -Rf scan_enterprise_dated.cgi
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <strstream>
#include <fstream>  //ifstream fin("ent_list");
#include "/usr/local/mysql/include/mysql/mysql.h"
//const char mysqlServer[20] = "172.16.1.77";
const char mysqlServer[20] = "10.88.15.114";
const char user[20]="web";
const char password[20]="sinatest";
const char database[20]="enterprise";
const char database2[20]="enterprisemail";
unsigned  int port=3306;
int flag=0;
char name[1024];
char query[1024];
char query2[1024];
char file_path[1024]="./ent_list";   //过期企业ID 数据文件
char file_path1[1024]="/tmp/enterprise.domain.successful.log";   //enterprise.domain的数据库select语句成功日志
char file_path2[1024]="/tmp/enterprise.domain.failed.log";   //enterprise.domain的数据库select语句失败日志
char file_path3[1024]="/tmp/enterprisemail.domain.successful.log";  //enterprisemail.domain数据库的update修改成功日志
char file_path4[1024]="/tmp/enterprisemail.domain.failed.log";  //enterprisemail.domain数据库的update语句修改失败日志
char file_path5[1024]="/tmp/enterprisemail.domain.successful.recover.log";  //enterprisemail.domain数据库的update语句修改失败日志



using namespace std;
//去掉读出的一行的前后空格
void trim(string& str)
{
str.erase(str.find_last_not_of(' ')+1, string::npos);
str.erase(0, str.find_first_not_of(' '));
}
//去前后空格函数结束

int main(int argv,char * argc[])//main函数体
{
  
  time_t t;
  struct tm *x;
  time( &t );
  x = localtime(&t);

  MYSQL myData,myData2,*sock,*sock2;
  MYSQL_RES *res;
  MYSQL_FIELD *fd;
  MYSQL_ROW row;
  mysql_init( &myData );
  mysql_init( &myData2 );
  if(argv!=2)
  {
    cout << "_____________________请在ent_list文件放入企业ID_______________\n";
    cout << "|然后请传入参数? (1,0)                                         |\n";
    cout << "|传入1:ent_dated_restet 1  为打开过期续费企业           |\n";
    cout << "|传入0:ent_dated_restet 0  关闭过期没有续费企业            \n";
    cout << "|______________________________________________________________|\n";
    cout << "|_你只要将要关闭或者打开的企业ID放到ent_list由1或者0来控制即可_|\n";
    cout << "| Warn:  连续一行一个企业ID(domain.enterpriseid)       \n";
    cout << "|______________________________________________________________|\n";
    return 0;
        
  }
  flag=atoi(argc[1]); //判断是关闭企业还是恢复企业
  if(!(sock = mysql_real_connect( &myData, mysqlServer, user, password, database,port,NULL,0)))
  {
    printf("can not connect mysql error...(enterprise.domain)\n");
    return 0;
        
  }
  if(!(sock2 = mysql_real_connect( &myData2, mysqlServer, user, password, database2,port,NULL,0)))
  {
    printf("can not connect mysql error...(enterprisemail.domain)\n");
    return 0;
  }
  //读取文本
  ifstream fin(file_path);
  ofstream fout1(file_path1,ios_base::app);//enterprise.domain的数据库select语句成功日志
  ofstream fout2(file_path2,ios_base::app);//enterprise.domain的数据库select语句失败日志
  ofstream fout3(file_path3,ios_base::app);//enterprisemail.domain数据库的update修改成功日志
  ofstream fout4(file_path4,ios_base::app); //enterprisemail.domain数据库的update语句修改失败日志
  ofstream fout5(file_path5,ios_base::app); //enterprisemail.domain数据库的update语句修改失败日志

  string str;
  while(getline(fin,str))
  {    
    trim(str);//去掉读出的一行前后空格
    char buffer[1024];
    int str_to_int=atoi(str.c_str());  
    sprintf(buffer,"%d",str_to_int);  
    if(strcmp(str.c_str(),buffer)!=0)
    {  
      cout <<str<<"Have contain special character in one line,please check...\n";
      fout2 <<  x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<  "Enterpriseid:\t" <<str <<"\tHave contain special character in one line,please check...\n";
      continue;
    }  
    memset(buffer,0,1024);//销毁临时变量
    //判断是否是数字    
    if (!str.length())
    {
      printf("请检查一下你的./ent_list里面是否有空行...\n");
      return 0;
    }
    
    strcpy(query,"select name from `domain` where name not like \"%shenbak\" and  enterpriseid=");
    strcat(query,str.c_str());
    cout<<query<<"\n";
    if( mysql_query(&myData, query) != 0 )
    {
    fout2 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<< "Enterpriseid:\t" <<str <<"\t Failed!\n";   //失败的select 查询记录到日志enterprise.domain.failed.log
    continue;
    }else{
        res = mysql_store_result( &myData);
        while(row = mysql_fetch_row(res))
        {
          fout1 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<"Enterpriseid:\t" << str <<"\tname:\t" << row[0] <<"\t Select sql Run Successful!\n";//写日志
          strcpy(name,row[0]);
        
               
          if(flag==0)  
          {
            strcpy(query2,"update\t`domain` set name=replace(name,name,concat(name,\"shenbak\")) where name not like \"%shenbak\" and name=");
            strcat(query2,"'");
            strcat(query2,name);
            strcat(query2,"'");
            cout << query2<<"\n";
          }
          if(flag==1)  
          {
          strcpy(query2,"update `domain` set name=replace(name,\"shenbak\",\"\") where name like \"%shenbak\" and name=");          
          strcat(query2,"'");
          strcat(query2,name);
          strcat(query2,"shenbak");
          strcat(query2,"'");
          }
          if( mysql_query(&myData2, query2) != 0 )
          {
          fout4 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<< "Enterpriseid:\t" << str <<"\tname:\t"<<name<<"\tupdate query failed!\n";
          continue;
          }else{
        
            if(flag==0)  
            {
          
              fout3 << x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<"Enterpriseid:\t" << str << "\tname:\t" <<name<<"\tupdate query successful!\n";
            //写屏蔽日志
            }  
            if(flag==1)
            {
              fout5 <<x->tm_year+1900 <<"年"<<x->tm_mon+1<<"月"<<x->tm_mday<<"日"<<x->tm_hour<<"点"<<x->tm_min<<"分"<<x->tm_sec<<"秒\t"<<"Enterpriseid:\t" << str << "\tname:\t" <<name<<"\tupdate query successful!\n";
          //写日恢复日志
          
            }  
                        
                    }
            
        memset(name,0,1024);  
        }  
      str="";
      memset(query,0,1024);  
      memset(query2,0,1024);  
          }
  }
  mysql_free_result(res);
  mysql_close(&myData);
  mysql_close(&myData2);
  fin.close();
  fout1.close();
  fout2.close();
  fout3.close();
  fout4.close();
  fout4.close();
  
  cout << "\nAll task run ok....Goodbye!\n";
}
http://www.mysql.com/doc/en/C.html  
    
  [转贴自http://homepage.qdcatv.com.cn/antonio/mysql/mysql.htm]  
    
  执行一个查询有以下几个步骤要做。首先执行一个查询,然后保存结果,  
  得到的是一个子集。这里是一个小例子:  
    
  #include    
  #include    
  #include   "mysql.h"  
    
  MYSQL   mysql;  
  MYSQL_RES   *res;  
  MYSQL_ROW   row;  
    
  void   exiterr(int   exitcode)  
  {  
  fprintf(   stderr,   "%s\n",   mysql_error(&mysql)   );  
  exit(   exitcode   );  
  }  
    
  int   main()  
  {  
  uint   i   =   0;  
    
  if   (!(mysql_connect(&mysql,"host","username","password")))    
  exiterr(1);  
    
  if   (mysql_select_db(&mysql,"payroll"))  
  exiterr(2);  
    
  if   (mysql_query(&mysql,"SELECT   name,rate   FROM   emp_master"))  
  exiterr(3);  
    
  if   (!(res   =   mysql_store_result(&mysql)))  
  exiterr(4);  
    
  while((row   =   mysql_fetch_row(res)))   {  
  for   (i=0   ;   i   <   mysql_num_fields(res);   i++)    
  printf("%s\n",row[i]);  
  }  
    
  mysql_free_result(res);  
  mysql_close(&mysql);  
  }  
    
    
  mysql_query   函数将把查询送给服务器,如果查询成功,调用mysql_store_result  
  函数将分配一个MYSQL_RES   结构并且重新从服务器获得一个结果集。你可以用    
  mysql_fetch_row   函数来查看数据。这样做你将获得一个   MYSQL_ROW   指针指向数  
  据中的一行。   MYSQL_ROW   指针是一简单的字符串数组。所有的数据类型被转换成  
  字符串送到客户端。  
      
    
  mysql_num_fields   函数将告诉你返回的列数。你可以继续调用   mysql_fetch_row  
  直到它返回一个空指针以得到查询中的每一行。  
    
  注意在这个例子里,我们没有检查有空指针的列。如果你不使用非空列的表,那么  
  你必须检查一个特殊行的列是否为空。  
    
  一旦你使用完毕一个结果集,你必须释放它。这通过   mysql_free_result   来完成。  
    
  最后调用   mysql_close   来关闭你和数据库之间的连接。  
    
  查看结果集  
    
  你可以不用调用   mysql_fetch_row   就查出返回的结果集共有多少行。这由  
  int   mysql_num_rows(MYSQL_RES   *result)来完成。  
  改变到被下一个   mysql_fetch_row   调用返回的行,你可以用    
  void   mysql_data_seek(MYSQL_RES   *res,   uint   offset)   改变到任意一行。  
    
  获得更多的信息  
    
  你可以使用这几个额外的函数来找出关于一个查询的更多的信息,并从服务器获得  
  这些信息。  
  如果你执行一个UPDATE,   INSERT   或者   DELETE   查询,你可以用    
  int   mysql_affected_rows   来查出共有多少行数据被你影响到。  
  如果在你的数据库里有二进制数据,那么得知数据的长度将是有用的。unsigned    
  int   *mysql_fetch_lengths(MYSQL_RES   *mysql)   将返回一指出了结果集中每一列  
  的长度的整型数组。  
    
  当你插入一个带有   AUTO_INCREMENT   列的表的时候,你可以用    
  int   mysql_insert_id(MYSQL   *mysql)   来查出生成的那一行的ID。  
======================

我连过成功了!  
    
  #include   "/include/mysql/mysql.h"   /*为绝对路径*/    
  #include   <stdio.h>    
    
  int   main(int   argc,char   *argv[])    
  {    
  char   *user   =   "root",   *pwd   =   "mysql",   *dbname   =   "mysql";    
  MYSQL   mysql;    
  MYSQL_RES   *mysql_ret;    
  MYSQL_ROW   mysql_row;    
  unsigned   long   num_rows;    
  int   ret;    
    
  mysql_init(&mysql);    
    
  if(mysql_real_connect(&mysql,NULL,user,pwd,dbname,0,NULL,0))    
  {    
  printf("Connection   success!\n");    
  ret   =   mysql_query(&mysql,"select   *   from   user");    
  if(!ret)    
  {    
  printf("Query   Success!\n");    
  mysql_ret   =   mysql_store_result(&mysql);    
  if(mysql_ret   !=   NULL)    
  {    
  printf("Store   Result   Success!\n");    
  num_rows   =   mysql_num_rows(mysql_ret);    
  if(num_rows   !=   0)    
  {    
  printf("%d\n",num_rows);    
  while(mysql_row   =   mysql_fetch_row(mysql_ret))    
  {    
  printf("%s\t%s\t%s\t%s\t%s\t%s\n",mysql_row[0],mysql_row[1],mysql_row[2],mysql_row[3],mysql_row[4],mysql_row[5]);    
  }    
  }    
  else    
  {    
  printf("mysql_num_rows   Failed!\n");    
  exit(-1);    
  }    
  mysql_free_result(mysql_ret);    
  exit(0);    
  }    
  else    
  {    
  printf("Store   Result   Failed!\n");    
  exit(-1);    
  }    
  }    
  else    
  {    
  printf("Query   Failed!\n");    
  exit(-1);    
  }    
  }    
  else    
  {    
  printf("Connection   Failed\n");    
  exit(-1);    
  }    
  }    
  如果你包含了正确的头文件而在连接的时候,   告诉你没有符号连接    
  你应该连接你需要的库    
    
  我的/lib/mysql/libmysqlclient.so下面    
  gcc   -L/lib/mysql   -lmysqlclient   -o   tes   tes.c   进行编译  
    
    
  RedHat_shu@hotmail.com
Simple Demo:


concat和Max混合用法:


select * from domain where enterpriseid='95358';

update `domain` set name=replace(name,name,concat(name,"shenbak")) where name not like "%shenbak" and enterpriseid='95358' ;
%表示后面有shenbak的,但是加了not,于是就没有问题了!

还回来:
update `domain` set name=replace(name,"shenbak","") where name like "%shenbak" and enterpriseid='95358';

update `film_info` set IMDB=REPLACE ( IMDB,'tt','');//将IMDB码的tt去掉,好建立索引


在数据转换的时候需要用到mysql的replace函数,这里简单介绍一下!

比如你要将 表 tb1里面的 f1字段的abc替换为def

Update tb1 SET f1=REPLACE(f1, 'abc', 'def');

REPLACE(str,from_str,to_str)    
在字符串   str   中所有出现的字符串   from_str   均被   to_str替换,然后返回这个字符串:    
mysql>   Select   REPLACE('www.mysql.com',   'w',   'Ww');  
                  ->   'WwWwWw.mysql.com'  
这个函数是多字节安全的。

示例:
Update  `dede_addonarticle`  SET body =  REPLACE ( body,
'</td>',
'' );
Update  `dede_addonarticle`  SET body =  REPLACE ( body,
'</tr>',
'' );
Update  `dede_addonarticle`  SET body =  REPLACE ( body,
'<tr>',
'' );      
Update  `dede_archives`  SET title=  REPLACE ( title,
'大洋新闻 - ',
'' );  
Update  `dede_addonarticle`  SET body =  REPLACE ( body,
'../../../../../../',
'http://special.dayoo.com/meal/' );

mysql replace

用法1.replace intoreplace into table (id,name) values(‘1‘,‘aa‘),(‘2‘,‘bb‘)
此语句的作用是向表table中插入两条记录。
2.replace(object, search,replace)
把object中出现search的全部替换为replaceselect replace(‘www.163.com‘,‘w‘,‘Ww‘)--->WwW wWw.163.com

例:把表table中的name字段中的 aa替换为bbupdate table set name=replace(name,‘aa‘,‘bb‘)

本文转载自『北漂石头的博客』
http://www.niutian365.com/blog/
更多精彩内容,欢迎访问北漂石头的博客!
#include <string>
#include <iostream>
#include <strstream>
#include <fstream>  //ifstream fin("ent_list");
#include "/usr/local/mysql/include/mysql/mysql.h"
const char mysqlServer[20] = "172.16.1.77";
//const char mysqlServer[20] = "10.88.15.114";
const char user[20]="web";
const char password[20]="sinatest";
const char database[20]="enterprise";
unsigned  int port=3306;

using namespace std;

//去掉读出的一行的前后空格
void trim(string& str)
{
str.erase(str.find_last_not_of(' ')+1, string::npos);
str.erase(0, str.find_first_not_of(' '));
}
//去前后空格函数结束

int main()//main函数体
{
  MYSQL myData;
  
  MYSQL_RES *res;
  MYSQL_FIELD *fd;
  MYSQL_ROW row;
  int i,j,rowCount = 0,colCount = 0;
  char query[1024];
  
  mysql_init( &myData );
  if(!mysql_real_connect( &myData, mysqlServer, user, password, database,port,NULL,0))
  {
    printf("connect mysql error!\n");
        
  }
  //读取文本
  
  ifstream fin("ent_list");
  string str;    
  while(getline(fin,str))
  {  
    trim(str);//去掉读出的一行前后空格
    //cout<<str<<"\n";
    strcpy(query,"select path from enterprise where enterpriseid=");
    strcat(query,str.c_str());
    //fprintf(stderr,"FILE=%s,LINE=%d,query=%s\n",__FILE__,__LINE__,query);
    
    if( mysql_query(&myData, query) != 0 )
    {
    printf("query error!\n");
    return 0;
    }else{
    
    
        res = mysql_store_result( &myData );
        rowCount = (int) mysql_num_rows( res );
        colCount = (int) mysql_num_fields( res );
        //printf(" result: %d records found\n fields: %d \n", rowCount, colCount);
        row = mysql_fetch_row( res );
        for(i = 0; i < rowCount; i++)
        {
          
          for( j = 0; j < colCount; j++)
            {
            cout <<"cd ";
            printf("%s", row[j] );
            cout <<";touch .expire;";
            cout<<"\n";
            }

        }
    
      }

  
  }




  

  
}





  在该网站上注册一个帐号,就可以拥有该站提供的多台Solaris、Fedora等Unix/Linux服务器的登录帐号。对于想学习Unix/Linux系统,却又苦于没有合适的环境和条件的教师、学生和工程人员来说,这是一份不错的免费资源。

  Unix体验中心:http://www.unix-center.net/
  可以上传、下载文件的SSH客户端软件--SecureCRT:http://blog.s135.com/read.php/207.htm

  以下简介信息摘自Unix体验中心:

  Unix体验中心(Unix-Center.Net)的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供如下服务:

  -- SSH登录
  -- C/C++,Fortran,Java,Ruby,Python,Perl,Common Lisp等多种语言开发工具

  本站的注册用户可以远程登录进入多个不同的系统,享受该系统上普通用户的所有权限,学习和使用各种版本的Unix和类Unix操作系统的常用命令和功能。开发人员更可以将自己正在开发的应用程序上载到Unix体验中心的服务器,在不同的软硬件平台上编译和运行,充分体验多处理器、多核、多线程的高性能计算的乐趣。

  到目前为止,本站已经有五个系统正式投入使用,如下:

  T1000/Solaris系统:
  硬件环境:1 颗UltraSPARC T1芯片,CPU 主频为1.0 GHz,八核四线程配置8 GB内存
  软件环境:Solaris 10 Update 3 for SPARC
  机器域名:t1000.unix-center.net(公网),t1000-edu.unix-center.net(教育网)

  X4100/Solaris系统:
  硬件环境:2 颗双核单线程的AMD Opteron 280芯片,CPU 主频为2.4 GHz,配置4 GB内存
  软件环境:Solaris 10 Update 3 for x86/x64
  机器域名:x4100.unix-center.net(公网),x4100-edu.unix-center.net(教育网)

  PE860/Solaris系统:
  硬件环境:1 颗双核单线程的Intel Xeon 3050芯片,CPU 主频为2.13 GHz,配置1 GB内存
  软件环境:Solaris 10 Update 3 for x86/x64
  机器域名:solaris.unix-center.net(公网),solaris-edu.unix-center.net(教育网)

  PE860/Fedora系统:
  硬件环境:1 颗双核单线程的Intel Xeon 3050芯片,CPU 主频为2.13 GHz,配置1 GB内存
  软件环境:Fedora Core 6
  机器域名:fedora.unix-center.net(公网),fedora-edu.unix-center.net(教育网)

  龙芯福珑系统:
  硬件环境: 3 台配置龙芯2E处理器的龙芯福珑计算机,CPU 主频为666 MHz,配置256 MB内存
  软件环境:Debian Linux for MIPS
  机器域名:仅限内网连接

  在2007年6 月底之前,本站还将增加一批新的服务器,届时将可以为网友提供FreeBSD和Ubuntu等多个版本的Unix和类Unix操作系统
//该程序通过mysql数据库得到path,然后通过函数GetUserDetailFilename得到user_info?.conf ? 里面的数字,然后配合mysql数据库里面取得的内容写入到文本中,修复rpc造成的影响让webmail的企业通讯录下员工名录得以正常查看任何一个用户的详细信息!xiangdong2@staff.sina.com.cn
//测试enterpriseid=100334;
//CC -o user_info_mysql.cgi user_info_mysql.cpp -L/usr/local/lib/mysql -lmysqlclient -I/usr/local/include
#include <fstream>
#include <iostream>
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <math.h>
#include "/usr/local/mysql/include/mysql/mysql.h"
const char mysqlServer[20] = "10.88.15.114";
const char user[20]="web";
const char password[20]="sinatest";
const char database[20]="enterprise";
unsigned  int port=3306;
#define DETAILFILE_NUM  10
static int GetUserDetailFilename(const char *email, char *filename, const unsigned int size=1);
char path[1024];
char ent_address[21]="/ent_address/";
char filename[100];
char  file_path_del[1024];
char buffer[1024],buffer1[1024],buffer2[1024],buffer3[1024],buffer4[1024],buffer5[1024],buffer6[1024],buffer7[1024],buffer8[1024],buffer9[1024];
using namespace std;
int main(int argc,char* argv[])
{
  
  MYSQL myData;
  MYSQL_RES *res;
  MYSQL_FIELD *fd;
  MYSQL_ROW row;
  int i,j,rowCount = 0,colCount = 0;
  string query="select path from enterprise where enterpriseid=";
  string query2 = "select email,realname,tel,mobile,address,office,enter_time,num,dept,flag from enterprisemail_info where enterpriseid=";
  if (argc < 2) {
    printf("usage:  请输入enterprise库enterprise表里面企业id(enterpriseid? Such As:./user_info_mysql.cgi 100334)\n", argv[0]);
    exit(1);
          }
    query+=argv[1];
  query2+=argv[1];

  mysql_init( &myData );
  if(!mysql_real_connect( &myData, mysqlServer, user, password, database,port,NULL,0))
  {
    printf("connect mysql error!\n");
        
  }
  
  
  if( mysql_query(&myData, query.c_str()) != 0 )
  {
  printf("query error!\n");
  return 0;
  }else{
    
     cout << "mysql query run ok!\n";
    
     }
  
  res = mysql_store_result( &myData );
  row = mysql_fetch_row( res );
  strcpy(path,row[0]);
  //cout << row[0]<<path;取得path然后加入ent_address/
  strcat(path,ent_address);
  //cout << path<<"\n";
  if( mysql_query(&myData, query2.c_str()) != 0 )
  {
  printf("query error!\n");
  return 0;
  }else{
    
     cout << "mysql query run ok!\n";
    
     }
  
  
  res = mysql_store_result( &myData );
  rowCount = (int) mysql_num_rows( res );
  colCount = (int) mysql_num_fields( res );
  //cout << "\t"<<colCount<<"\t"<<rowCount<<"\n";
  
  char num[2];
  for(i=0;i<=10;i++){//构造从user_info0.conf to user_info10.conf 路径然后del掉他们,为下面从数据库取写做准备

  strcpy(file_path_del,path);
  strcat(file_path_del,"user_info");
  sprintf(num,"%d",i);
  strcat(file_path_del,num);
  strcat(file_path_del,".conf");
  if( remove(file_path_del) != 0 )//删除文件
    cout << "Error deleting "<< file_path_del <<" file, \t Because it is not exit! But it is still Ok...\n";
    else
    cout << "File" <<file_path_del<<" successfully deleted\n";
  
    }
  
  for(i = 0; i < rowCount; i++)
  {      
    row = mysql_fetch_row( res );
    for(j=0;j<colCount;j++){
    strcpy(buffer,row[0]);
    strcpy(buffer1,row[1]);
    strcpy(buffer2,row[2]);
    strcpy(buffer3,row[3]);
    strcpy(buffer4,row[4]);
    strcpy(buffer5,row[5]);
    strcpy(buffer6,row[6]);
    strcpy(buffer7,row[7]);
    strcpy(buffer8,row[8]);
    strcpy(buffer9,row[9]);
        
    char* p = strstr(buffer,"@");
    *p=0;
    //取@前面的
    const char *uid;
    uid=buffer;
    
    if(GetUserDetailFilename(uid, filename, 100)<0)//获取目录位置
    {
      cout<<"GetUserDetailFilename() erro...";  
  
    }
      
                 }//字段数循环
    char file_path[1024];
    strcpy(file_path,path);
    strcat(file_path,filename);//得到文件的完整的path路径
    //cout<<"file_path="<<file_path<<"\n\n";

    //write file
    ofstream fout(file_path,ios_base::app);
    fout <<"[USER:"<<buffer<<"]\n"<<"EMAIL="<<buffer<<"\n"<<"REALNAME="<<buffer1<<"\n"<<"TEL="<<buffer2<<"\n"<<"MOBILE="<<buffer3<<"\n"<<"ADDRESS="<<buffer4<<"\n"<<"OFFICE="<<buffer5<<"\n"<<"ENTER_TIME="<<buffer6<<"\n"<<"NUM="<<buffer7<<"\n"<<"DEPT="<<buffer8<<"\n"<<"FLAG="<<buffer9<<"\n";

    fout.close();
    


    memset(file_path, 0, 1024);//清空该变量 清空其它字段缓存
    memset(buffer, 0, 1024);
    memset(buffer1, 0, 1024);
    memset(buffer2, 0, 1024);
    memset(buffer3, 0, 1024);
    memset(buffer4, 0, 1024);
    memset(buffer5, 0, 1024);
    memset(buffer6, 0, 1024);
    memset(buffer7, 0, 1024);
    memset(buffer8, 0, 1024);
    memset(buffer9, 0, 1024);
    
      
  }//条目数
  
  cout <<"\n\n\nVery good ,The task  finished all right!\t goodbye...\n\n\n";

}




int GetUserDetailFilename(const char *email, char *filename, const unsigned
int size)
{
  if(!email || !filename)return -1;
  int t=0, n;
  for(int i=0; i<strlen(email); i++)
    t+=email[i];
  
  n = (int)fmod(t, DETAILFILE_NUM)+1;
  if(snprintf(filename, size, "user_info%d.conf", n)>=size)return -1;
  return 0;
}

c++ remove函数

WEB2.0 jack 2008-3-17 11:40
remove function
int remove ( const char * filename ); <cstdio>

Remove file

Deletes the file whose name is specified in filename.
This is an operation performed directly on a file; No streams are involved in the operation.


Parameters
filename
C string containing the name of the file to be deleted. This paramenter must follow the file name specifications of the running environment and can include a path if the system supports it.

Return value
If the file is successfully deleted, a zero value is returned.
On failure, a nonzero value is reurned and the errno variable is set to the corresponding error code. Error codes are numerical values representing the type of failure occurred. A string interpreting this value can be printed to the standard error stream by a call to perror.

Example
/* remove example: remove myfile.txt */
#include <stdio.h>

int main ()
{
  if( remove( "myfile.txt" ) != 0 )
    perror( "Error deleting file" );
  else
    puts( "File successfully deleted" );
  return 0;
}


If the file example.txt existed before the execution and we had write access to it, then the file will be deleted and this message will be written to stdout:
File successfully deleted

Otherwise, a message similar to this will be written to stderr:
Error deleting file: No such file or directory


See also
rename Rename file (function)
问:
用PHP把数据库导出为excel文件,并且能导出格式及背景、线条等!
______________________________________________________________________________________________
答1:
gz
______________________________________________________________________________________________
答2:
gz
______________________________________________________________________________________________
答3:
如果是直接导出到EXCEL的话,依目前的技术能力似乎还不能做到。连大名鼎鼎的OpenOffice对EXCEL的支持也不是很好。
不过有种投机取巧的方法可以实现,就是从数据库中取出数据后,生成一个表格,样式自己定义好,然后让浏览器识别为下载excel。以下只是一个示例:

<?php
// 转载请注明phpteam
$title = "数据库名:test, 数据表:test, 备份日期:" . date("Y-m-d H:i:s");

$conn = @mysql_connect("localhost", "root", "") or die("不能连接数据库");
@mysql_select_db("test", $conn);
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=test.xls");
header("Pragma: no-cache");
header("Expires: 0");
echo '<table border="1" cellspacing="2" cellpadding="2" width="50%" align="center">';
// 输出标题
echo '<tr bgcolor="#cccccc"><td colspan="3" align="center">' . $title . '</td></tr>';

$query = "select * from test";
$result = mysql_query($query) or die(mysql_error());
$fields = mysql_num_fields($result);
// 输出字段名
echo '<tr bgcolor="blue">';
for($i = 0; $i < $fields; $i++) {
    echo '<td>' . mysql_field_name($result, $i) . '</td>';
}
echo '</tr>';
// 输出内容
while($row = mysql_fetch_row($result)) {
    echo '<tr>';
    for($i = 0; $i<$fields; $i++) {
        echo '<td>' . $row[$i] . '</td>';
    }
    echo '</tr>';
}
echo '</table>';
?>
______________________________________________________________________________________________
答4:
其实这个问题应该这样问:用ASP把数据库导出为excel文件,并且能导出格式及背景、线条等
如果行,则用php就行

______________________________________________________________________________________________
答5:
我今天找到一个网上,可以这样做的,但不知道怎么做的。

http://www.time-assistant.com/tastandard/hlogin.php

username:joesen

password:joesen

进入admin菜单下,有一个XLS按钮,导出为excel,导到本地,你看一下就知道了。
______________________________________________________________________________________________
答6:
哈哈,托你的福,我已经知道怎么解决了,你把下面着段代码存为.xls文件看看,知道该怎么做了吧?


  <html xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns="http://www.w3.org/TR/REC-html40">
  <head>
        <meta http-equiv="expires" content="Mon, 06 Jan 1999 00:00:01 GMT">
        <meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
        <!--[if gte mso 9]><xml>
        <x:ExcelWorkbook>
        <x:ExcelWorksheets>
                <x:ExcelWorksheet>
                <x:Name></x:Name>
                <x:WorksheetOptions>
                        <x:DisplayGridlines/>
                </x:WorksheetOptions>
                </x:ExcelWorksheet>
        </x:ExcelWorksheets>
        </x:ExcelWorkbook>
        </xml><![endif]-->

  </head>

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td align="center" class="big6" >Users (except the ones disabled)</td></tr>

<tr><td class="greyborder">
  <table border="1" align="center" width="100%" cellpadding="1" cellspacing="1">
  <tr align="center">
      <td class="TableTopHeader" nowrap>
      Login   </td>
   <td class="TableTopHeader" nowrap>
      Name   </td>
   <td class="TableTopHeader" width="3%" nowrap>
      EMail   </td>
   <td class="TableTopHeader" nowrap>
    Department   </td>
   <td class="TableTopHeader" nowrap>
    Position   </td>
   <td class="TableTopHeader" nowrap width="1%">
     Level   </td>
   <td class="TableTopHeader">Address</td>
   <td class="TableTopHeader">Phone</td>
</tr>
    <tr  class="even">
    
      <td class="mtlist"> joesen</td>
      <td class="mtlist"> hong joesen</td>
      <td class="mtlist" >allfu@163.net</td>
      <td class="mtlist"> Software developments</td>
      <td class="mtlist"> System Administrator</td>
      <td class="mtlist"> Admin</td>
    
      
      <td class="mtlist"> </td>
      <td class="mtlist"> </td>
  </tr>
  </table>
</td></tr>  
</table>
______________________________________________________________________________________________
答7:
结贴吧!
这就是 phpteam(我忍住不哭) 提供的方法

不错,不错。有长见识了!

______________________________________________________________________________________________
答8:
能说清楚点吗?我还是不明白。
______________________________________________________________________________________________
答9:
up
______________________________________________________________________________________________
答10:
zh_yuandc(中原大帝)贴出的就是从http://www.time-assistant.com/tastandard/hlogin.php
下载下来的.xls文件,你用文本编辑器打开就是那个样子。你用Excel打开就可以进行编辑。

我理解他是一个Excel可识别处理的xml文档,不是真正的Excel文档。但这已经很好了。
”文件”中如果没有指定路径,则在该可执行文件相同的文件夹下,如果指定路径则在该路径下,如:
ofstream ofile("output.dat");
ofstream ofile("c:\\temp\\output.dat");

如果文件不存在,则一般新建一个文件。打开方式,如按二进制打开
ofstream ofile("output.dat", ios_base::binary);
[b]如果追加方式打开,则:[/b]
ofstream ofile("output.dat", ios_base::app);
注意:ofstream 流在打开方式中已经默认了ios_base::out,故这个参数一般不必重复使用,如:
ofstream ofile("output.dat", ios_base::out);

早期的C++语言使用ios代替ios_base

序论
  我曾发表过文件输入输出的文章,现在觉得有必要再写一点。文件 I/O 在C++中比烤蛋糕简单多了。 在这篇文章里,我会详细解释ASCII和二进制文件的输入输出的每个细节,值得注意的是,所有这些都是用C++完成的。

一、ASCII 输出
  为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< fstream.h>,所有的C++标准头文件都是无后缀的。)。这是 <iostream.h>的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, <iostream.h> 已经被<fstream.h>包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。
如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部分,首先声明一个类对象。

ofstream fout;

这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。

fout.open("output.txt");

你也可以把文件名作为构造参数来打开一个文件.

ofstream fout("output.txt");

  这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操作很像。 对不了解控制台输出"cout"的人, 这里有个例子。

int num = 150;char name[] = "John Doe";fout << "Here is a number: " << num << "\n";fout << "Now here is a string: " << name << "\n";

  现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样:

fout << flush; fout.close();

现在你用文本编辑器打开文件,内容看起来是这样:

Here is a number: 150 Now here is a string: John Doe

  很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<<" 和">>" 比较熟悉了, 因为你接下来还要用到他们。继续…

二、ASCII 输入
  输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前, 先看一个文本:

12 GameDev 15.45 L This is really awesome!

为了打开这个文件,你必须创建一个in-stream对象,?像这样。

ifstream fin("input.txt");

  现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<<" (插入)?操作符之后,是">>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.

int number; float real; char letter, word[8]; fin >> number; fin >> word; fin >> real; fin >> letter;

也可以把这四行读取文件的代码写为更简单的一行。

fin >> number >> word >> real >> letter;

  它是如何运作的呢? 文件的每个空白之后, ">>" 操作符会停止读取内容, 直到遇到另一个>>操作符. 因为我们读取的每一行都被换行符分割开(是空白字符), ">>" 操作符只把这一行的内容读入变量。这就是这个代码也能正常工作的原因。但是,可别忘了文件的最后一行。

This is really awesome!

  如果你想把整行读入一个char数组, 我们没办法用">>"?操作符,因为每个单词之间的空格(空白字符)会中止文件的读取。为了验证:

char sentence[101]; fin >> sentence;

  我们想包含整个句子, "This is really awesome!" 但是因为空白, 现在它只包含了"This". 很明显, 肯定有读取整行的方法, 它就是getline()。这就是我们要做的。

fin.getline(sentence, 100);

  这是函数参数. 第一个参数显然是用来接受的char数组. 第二个参数是在遇到换行符之前,数组允许接受的最大元素数量. 现在我们得到了想要的结果:“This is really awesome!”。
你应该已经知道如何读取和写入ASCII文件了。但我们还不能罢休,因为二进制文件还在等着我们。

三、二进制 输入输出
  二进制文件会复杂一点, 但还是很简单的。 首先你要注意我们不再使用插入和提取操作符(译者注:<< 和 >> 操作符). 你可以这么做,但它不会用二进制方式读写。你必须使用read() 和write() 方法读取和写入二进制文件. 创建一个二进制文件, 看下一行。

ofstream fout("file.dat", ios::binary);

  这会以二进制方式打开文件, 而不是默认的ASCII模式。首先从写入文件开始。函数write() 有两个参数。 第一个是指向对象的char类型的指针, 第二个是对象的大小(译者注:字节数)。 为了说明,看例子。

int number = 30; fout.write((char *)(&number), sizeof(number));

  第一个参数写做"(char *)(&number)". 这是把一个整型变量转为char *指针。如果你不理解,可以立刻翻阅C++的书籍,如果有必要的话。第二个参数写作"sizeof(number)". sizeof() 返回对象大小的字节数. 就是这样!
二进制文件最好的地方是可以在一行把一个结构写入文件。 如果说,你的结构有12个不同的成员。 用ASCII?文件,你不得不每次一条的写入所有成员。 但二进制文件替你做好了。 看这个。

struct OBJECT { int number; char letter; } obj; obj.number = 15;obj.letter = ‘M’; fout.write((char *)(&obj), sizeof(obj));

  这样就写入了整个结构! 接下来是输入. 输入也很简单,因为read()?函数的参数和 write()是完全一样的, 使用方法也相同。

ifstream fin("file.dat", ios::binary); fin.read((char *)(&obj), sizeof(obj));

  我不多解释用法, 因为它和write()是完全相同的。二进制文件比ASCII文件简单, 但有个缺点是无法用文本编辑器编辑。 接着, 我解释一下ifstream 和ofstream 对象的其他一些方法作为结束.

四、更多方法
  我已经解释了ASCII文件和二进制文件, 这里是一些没有提及的底层方法。

检查文件
你已经学会了open() 和close() 方法, 不过这里还有其它你可能用到的方法。
方法good() 返回一个布尔值,表示文件打开是否正确。
类似的,bad() 返回一个布尔值表示文件打开是否错误。 如果出错,就不要继续进一步的操作了。
最后一个检查的方法是fail(), 和bad()有点相似, 但没那么严重。

读文件
方法get() 每次返回一个字符。
方法ignore(int,char) 跳过一定数量的某个字符, 但你必须传给它两个参数。第一个是需要跳过的字符数。 第二个是一个字符, 当遇到的时候就会停止。 例子,

fin.ignore(100, ‘\n’);

会跳过100个字符,或者不足100的时候,跳过所有之前的字符,包括 ‘\n’。
方法peek() 返回文件中的下一个字符, 但并不实际读取它。所以如果你用peek() 查看下一个字符, 用get() 在peek()之后读取,会得到同一个字符, 然后移动文件计数器。
方法putback(char) 输入字符, 一次一个, 到流中。我没有见到过它的使用,但这个函数确实存在。

写文件
只有一个你可能会关注的方法.?那就是 put(char), 它每次向输出流中写入一个字符。

打开文件
当我们用这样的语法打开二进制文件:

ofstream fout("file.dat", ios::binary);

  "ios::binary"是你提供的打开选项的额外标志. 默认的, 文件以ASCII方式打开, 不存在则创建, 存在就覆盖. 这里有些额外的标志用来改变选项。
ios::app   添加到文件尾
ios::ate   把文件标志放在末尾而非起始。
ios::trunc   默认. 截断并覆写文件。
ios::nocreate   文件不存在也不创建。
ios::noreplace      文件存在则失败。

文件状态
  我用过的唯一一个状态函数是eof(), 它返回是否标志已经到了文件末尾。 我主要用在循环中。 例如, 这个代码断统计小写‘e’ 在文件中出现的次数。

ifstream fin("file.txt"); char ch; int counter; while (!fin.eof()) {      ch = fin.get();       if (ch == ‘e’) counter++; }fin.close();

  我从未用过这里没有提到的其他方法。 还有很多方法,但是他们很少被使用。参考C++书籍或者文件流的帮助文档来了解其他的方法。

结论
  你应该已经掌握了如何使用ASCII文件和二进制文件。有很多方法可以帮你实现输入输出,尽管很少有人使用他们。我知道很多人不熟悉文件I/O操作,我希望这篇文章对你有所帮助。 每个人都应该知道. 文件I/O还有很多显而易见的方法,?例如包含文件 <stdio.h>. 我更喜欢用流是因为他们更简单。 祝所有读了这篇文章的人好运, 也许以后我还会为你们写些东西。 


//使用(C++库)ofstream写文件数据
//simple example
#include <iostream>
#include <fstream>
using namespace std;
#ifdef WIN32
#define TEST_FILE "c:\\shi\\aaa.txt"
#else
#define TEST_FILE "/tmp/test.txt"
#endif
void test()
{
//ofstream ofs;
//ofs.open(TEST_FILE);
ofstream ofs(TEST_FILE);
char ch = '#';
const char buf[] = "1234567890";
ofs.put(ch);//simple
ofs.write(buf, sizeof(buf));
ofs.put(ch);
ofs.close();
}
int main(int argc, char* argv[])
{
test();
return 0;
}
http://www.cnblogs.com/meil/category/62517.html?Show=All
JavaScript 是使用“对象化编程”的,或者叫“面向对象编程”的。所谓“对象化编程”,意思是把 JavaScript 能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编程都以对象为出发点,基于对象。小到一个变量,大到网页文档、窗口甚至屏幕,都是对象。这一章将“面向对象”讲述 JavaScript 的运行情况。
对象的基本知识
对象是可以从 JavaScript“势力范围”中划分出来的一小块,可以是一段文字、一幅图片、一个表单(Form)等等。每个对象有它自己的属性、方法和事件。对象的属性是反映该对象某些特定的性质的,例如:字符串的长度、图像的长宽、文字框(Textbox)里的文字等等;对象的方法能对该对象做一些事情,例如,表单的“提交”(Submit),窗口的“滚动”(Scrolling)等等;而对象的事件就能响应发生在对象上的事情,例如提交表单产生表单的“提交事件”,点击连接产生的“点击事件”。不是所有的对象都有以上三个性质,有些没有事件,有些只有属性。引用对象的任一“性质”用“<对象名>.<性质名>”这种方法。

基本对象
现在我们要复习以上学过的内容了——把一些数据类型用对象的角度重新学习一下。

Number “数字”对象。这个对象用得很少,作者就一次也没有见过。不过属于“Number”的对象,也就是“变量”就多了。

属性

MAX_VALUE 用法:Number.MAX_VALUE;返回“最大值”。
MIN_VALUE 用法:Number.MIN_VALUE;返回“最小值”。
NaN 用法:Number.NaN 或 NaN;返回“NaN”(不是数值)在很早就介绍过了。
NEGATIVE_INFINITY 用法:Number.NEGATIVE_INFINITY;返回:负无穷大,比“最小值”还小的值。
POSITIVE_INFINITY 用法:Number.POSITIVE_INFINITY;返回:正无穷大,比“最大值”还大的值。

方法

toString() 用法:<数值变量>.toString();返回:字符串形式的数值。如:若 a == 123;则 a.toString() == '123'。

String 字符串对象。声明一个字符串对象最简单、快捷、有效、常用的方法就是直接赋值。

属性

length 用法:<字符串对象>.length;返回该字符串的长度。

方法

charAt() 用法:<字符串对象>.charAt(<位置>);返回该字符串位于第<位置>位的单个字符。注意:字符串中的一个字符是第 0 位的,第二个才是第 1 位的,最后一个字符是第 length - 1 位的。
charCodeAt() 用法:<字符串对象>.charCodeAt(<位置>);返回该字符串位于第<位置>位的单个字符的 ASCII 码。
fromCharCode() 用法:String.fromCharCode(a, b, c...);返回一个字符串,该字符串每个字符的 ASCII 码由 a, b, c... 等来确定。
indexOf() 用法:<字符串对象>.indexOf(<另一个字符串对象>[, <起始位置>]);该方法从<字符串对象>中查找<另一个字符串对象>(如果给出<起始位置>就忽略之前的位置),如果找到了,就返回它的位置,没有找到就返回“-1”。所有的“位置”都是从零开始的。
lastIndexOf() 用法:<字符串对象>.lastIndexOf(<另一个字符串对象>[, <起始位置>]);跟 indexOf() 相似,不过是从后边开始找。
split() 用法:<字符串对象>.split(<分隔符字符>);返回一个数组,该数组是从<字符串对象>中分离开来的,<分隔符字符>决定了分离的地方,它本身不会包含在所返回的数组中。例如:'1&2&345&678'.split('&')返回数组:1,2,345,678。关于数组,我们等一下就讨论。
substring() 用法:<字符串对象>.substring(<始>[, <终>]);返回原字符串的子字符串,该字符串是原字符串从<始>位置到<终>位置的前一位置的一段。<终> - <始> = 返回字符串的长度(length)。如果没有指定<终>或指定得超过字符串长度,则子字符串从<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,则返回空字符串。
substr() 用法:<字符串对象>.substr(<始>[, <长>]);返回原字符串的子字符串,该字符串是原字符串从<始>位置开始,长度为<长>的一段。如果没有指定<长>或指定得超过字符串长度,则子字符串从<始>位置一直取到原字符串尾。如果所指定的位置不能返回字符串,则返回空字符串。
toLowerCase() 用法:<字符串对象>.toLowerCase();返回把原字符串所有大写字母都变成小写的字符串。
toUpperCase() 用法:<字符串对象>.toUpperCase();返回把原字符串所有小写字母都变成大写的字符串。

Array 数组对象。数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置(既然是“位置”,就也是从零开始的啦)。

数组的定义方法:

var <数组名> = new Array();

这样就定义了一个空数组。以后要添加数组元素,就用:

<数组名>[<下标>] = ...;

注意这里的方括号不是“可以省略”的意思,数组的下标表示方法就是用方括号括起来。

如果想在定义数组的时候直接初始化数据,请用:

var <数组名> = new Array(<元素1>, <元素2>, <元素3>...);

例如,var myArray = new Array(1, 4.5, 'Hi'); 定义了一个数组 myArray,里边的元素是:myArray[0] == 1; myArray[1] == 4.5; myArray[2] == 'Hi'。

但是,如果元素列表中只有一个元素,而这个元素又是一个正整数的话,这将定义一个包含<正整数>个空元素的数组。

注意:JavaScript只有一维数组!千万不要用“Array(3,4)”这种愚蠢的方法来定义 4 x 5 的二维数组,或者用“myArray[2,3]”这种方法来返回“二维数组”中的元素。任意“myArray[...,3]”这种形式的调用其实只返回了“myArray[3]”。要使用多维数组,请用这种虚拟法:

var myArray = new Array(new Array(), new Array(), new Array(), ...);

其实这是一个一维数组,里边的每一个元素又是一个数组。调用这个“二维数组”的元素时:myArray[2][3] = ...;

属性

length 用法:<数组对象>.length;返回:数组的长度,即数组里有多少个元素。它等于数组里最后一个元素的下标加一。所以,想添加一个元素,只需要:myArray[myArray.length] = ...。

方法

join() 用法:<数组对象>.join(<分隔符>);返回一个字符串,该字符串把数组中的各个元素串起来,用<分隔符>置于元素与元素之间。这个方法不影响数组原本的内容。
reverse() 用法:<数组对象>.reverse();使数组中的元素顺序反过来。如果对数组[1, 2, 3]使用这个方法,它将使数组变成:[3, 2, 1]。
slice() 用法:<数组对象>.slice(<始>[, <终>]);返回一个数组,该数组是原数组的子集,始于<始>,终于<终>。如果不给出<终>,则子集一直取到原数组的结尾。
sort() 用法:<数组对象>.sort([<方法函数>]);使数组中的元素按照一定的顺序排列。如果不指定<方法函数>,则按字母顺序排列。在这种情况下,80 是比 9 排得前的。如果指定<方法函数>,则按<方法函数>所指定的排序方法排序。<方法函数>比较难讲述,这里只将一些有用的<方法函数>介绍给大家。

按升序排列数字:

function sortMethod(a, b) {
    return a - b;
}

myArray.sort(sortMethod);

按降序排列数字:把上面的“a - b”该成“b - a”。

有关函数,请看下面。

Math “数学”对象,提供对数据的数学计算。下面所提到的属性和方法,不再详细说明“用法”,大家在使用的时候记住用“Math.<名>”这种格式。

属性

E 返回常数 e (2.718281828...)。
LN2 返回 2 的自然对数 (ln 2)。
LN10 返回 10 的自然对数 (ln 10)。
LOG2E 返回以 2 为低的 e 的对数 (log2e)。
LOG10E 返回以 10 为低的 e 的对数 (log10e)。
PI 返回π(3.1415926535...)。
SQRT1_2 返回 1/2 的平方根。
SQRT2 返回 2 的平方根。

方法

abs(x) 返回 x 的绝对值。
acos(x) 返回 x 的反余弦值(余弦值等于 x 的角度),用弧度表示。
asin(x) 返回 x 的反正弦值。
atan(x) 返回 x 的反正切值。
atan2(x, y) 返回复平面内点(x, y)对应的复数的幅角,用弧度表示,其值在 -π 到 π 之间。
ceil(x) 返回大于等于 x 的最小整数。
cos(x) 返回 x 的余弦。
exp(x) 返回 e 的 x 次幂 (ex)。
floor(x) 返回小于等于 x 的最大整数。
log(x) 返回 x 的自然对数 (ln x)。
max(a, b) 返回 a, b 中较大的数。
min(a, b) 返回 a, b 中较小的数。
pow(n, m) 返回 n 的 m 次幂 (nm)。
random() 返回大于 0 小于 1 的一个随机数。
round(x) 返回 x 四舍五入后的值。
sin(x) 返回 x 的正弦。
sqrt(x) 返回 x 的平方根。
tan(x) 返回 x 的正切。

Date 日期对象。这个对象可以储存任意一个日期,从 0001 年到 9999 年,并且可以精确到毫秒数(1/1000 秒)。在内部,日期对象是一个整数,它是从 1970 年 1 月 1 日零时正开始计算到日期对象所指的日期的毫秒数。如果所指日期比 1970 年早,则它是一个负数。所有日期时间,如果不指定时区,都采用“UTC”(世界时)时区,它与“GMT”(格林威治时间)在数值上是一样的。

定义一个日期对象:

var d = new Date;

这个方法使 d 成为日期对象,并且已有初始值:当前时间。如果要自定初始值,可以用:

var d = new Date(99, 10, 1);     //99 年 10 月 1 日
var d = new Date('Oct 1, 1999'); //99 年 10 月 1 日

等等方法。最好的方法就是用下面介绍的“方法”来严格的定义时间。

方法

以下有很多“g/set[UTC]XXX”这样的方法,它表示既有“getXXX”方法,又有“setXXX”方法。“get”是获得某个数值,而“set”是设定某个数值。如果带有“UTC”字母,则表示获得/设定的数值是基于 UTC 时间的,没有则表示基于本地时间或浏览期默认时间的。

如无说明,方法的使用格式为:“<对象>.<方法>”,下同。

g/set[UTC]FullYear() 返回/设置年份,用四位数表示。如果使用“x.set[UTC]FullYear(99)”,则年份被设定为 0099 年。
g/set[UTC]Year() 返回/设置年份,用两位数表示。设定的时候浏览器自动加上“19”开头,故使用“x.set[UTC]Year(00)”把年份设定为 1900 年。
g/set[UTC]Month() 返回/设置月份。
g/set[UTC]Date() 返回/设置日期。
g/set[UTC]Day() 返回/设置星期,0 表示星期天。
g/set[UTC]Hours() 返回/设置小时数,24小时制。
g/set[UTC]Minutes() 返回/设置分钟数。
g/set[UTC]Seconds() 返回/设置秒钟数。
g/set[UTC]Milliseconds() 返回/设置毫秒数。
g/setTime() 返回/设置时间,该时间就是日期对象的内部处理方法:从 1970 年 1 月 1 日零时正开始计算到日期对象所指的日期的毫秒数。如果要使某日期对象所指的时间推迟 1 小时,就用:“x.setTime(x.getTime() + 60 * 60 * 1000);”(一小时 60 分,一分 60 秒,一秒 1000 毫秒)。
getTimezoneOffset() 返回日期对象采用的时区与格林威治时间所差的分钟数。在格林威治东方的市区,该值为负,例如:中国时区(GMT+0800)返回“-480”。
toString() 返回一个字符串,描述日期对象所指的日期。这个字符串的格式类似于:“Fri Jul 21 15:43:46 UTC+0800 2000”。
toLocaleString() 返回一个字符串,描述日期对象所指的日期,用本地时间表示格式。如:“2000-07-21 15:43:46”。
toGMTString() 返回一个字符串,描述日期对象所指的日期,用 GMT 格式。
toUTCString() 返回一个字符串,描述日期对象所指的日期,用 UTC 格式。
parse() 用法:Date.parse(<日期对象>);返回该日期对象的内部表达方式。

全局对象
全局对象从不现形,它可以说是虚拟出来的,目的在于把全局函数“对象化”。在 Microsoft JScript 语言参考中,它叫做“Global 对象”,但是引用它的方法和属性从来不用“Global.xxx”(况且这样做会出错),而直接用“xxx”。

属性

一早就说过了。

方法

eval() 把括号内的字符串当作标准语句或表达式来运行。
isFinite() 如果括号内的数字是“有限”的(介于 Number.MIN_VALUE 和 Number.MAX_VALUE 之间)就返回 true;否则返回 false。
isNaN() 如果括号内的值是“NaN”则返回 true 否则返回 false。
parseInt() 返回把括号内的内容转换成整数之后的值。如果括号内是字符串,则字符串开头的数字部分被转换成整数,如果以字母开头,则返回“NaN”。
parseFloat() 返回把括号内的字符串转换成浮点数之后的值,字符串开头的数字部分被转换成浮点数,如果以字母开头,则返回“NaN”。
toString() 用法:<对象>.toString();把对象转换成字符串。如果在括号中指定一个数值,则转换过程中所有数值转换成特定进制。
escape() 返回括号中的字符串经过编码后的新字符串。该编码应用于 URL,也就是把空格写成“%20”这种格式。“+”不被编码,如果要“+”也被编码,请用:escape('...', 1)。
unescape() 是 escape() 的反过程。解编括号中字符串成为一般字符串。

函数
函数的定义

所谓“函数”,是有返回值的对象或对象的方法。

函数的种类

常见的函数有:构造函数,如 Array(),能构造一个数组;全局函数,即全局对象里的方法;自定义函数;等等。

自定义函数

定义函数用以下语句:

function 函数名([参数集]) {
    ...
    [return[ <值>];]
    ...
}

其中,用在 function 之后和函数结尾的大括号是不能省去的,就算整个函数只有一句。

函数名与变量名有一样的起名规定,也就是只包含字母数字下划线、字母排头、不能与保留字重复等。

参数集可有可无,但括号就一定要有。

参数 是函数外部向函数内部传递信息的桥梁,例如,想叫一个函数返回 3 的立方,你就要让函数知道“3”这个数值,这时候就要有一个变量来接收数值,这种变量叫做参数。

参数集是一个或多个用逗号分隔开来的参数的集合,如:a, b, c。

函数的内部有一至多行语句,这些语句并不会立即执行,而只当有其它程序调用它时才执行。这些语句中可能包含“return”语句。在执行一个函数的时候,碰到 return 语句,函数立刻停止执行,并返回到调用它的程序中。如果“return”后带有<值>,则退出函数的同时返回该值。

在函数的内部,参数可以直接当作变量来使用,并可以用 var 语句来新建一些变量,但是这些变量都不能被函数外部的过程调用。要使函数内部的信息能被外部调用,要么使用“return”返回值,要么使用全局变量。

全局变量 在 Script 的“根部”(非函数内部)的“var”语句所定义的变量就是全局变量,它能在整个过程的任意地方被调用、更改。



function addAll(a, b, c) {
    return a + b + c;
}

var total = addAll(3, 4, 5);

这个例子建立了一个叫“addAll”的函数,它有 3 个参数:a, b, c,作用是返回三个数相加的结果。在函数外部,利用“var total = addAll(3, 4, 5);”接收函数的返回值。

更多的时候,函数是没有返回值的,这种函数在一些比较强调严格的语言中是叫做“过程”的,例如 Basic 类语言的“Sub”、Pascal 语言的“procedure”。

属性

arguments 一个数组,反映外部程序调用函数时指定的参数。用法:直接在函数内部调用“arguments”。
#include <fstream>
#include <iostream>
#include "/usr/local/mysql/include/mysql/mysql.h"
const char mysqlServer[20] = "10.88.15.114";
//const char mysqlServer[20] = "10.88.15.114";
const char user[20]="web";
const char password[20]="sinatest";
const char database[20]="enterprise";
unsigned  int port=3306;
using namespace std;
int main()
{
  
  MYSQL myData;
  
  MYSQL_RES *res;
  MYSQL_FIELD *fd;
  MYSQL_ROW row;
  int i,j,rowCount = 0,colCount = 0;
  string query;
  
  mysql_init( &myData );
  if(!mysql_real_connect( &myData, mysqlServer, user, password, database,port,NULL,0))
  {
    printf("connect mysql error!\n");
        
  }
  cout <<"the mysql is ok!\n";
  query = "select email from enterprisemail_info where enterpriseid=100334 ";
  if( mysql_query(&myData, query.c_str()) != 0 )
  {
  printf("query error!\n");
  cout << query;
  return 0;
  }else{
    
     cout << "mysql query run ok!\n";
    
     }
  res = mysql_store_result( &myData );
  rowCount = (int) mysql_num_rows( res );
  colCount = (int) mysql_num_fields( res );
  
  //cout << colCount<<"\t"<<rowCount<<"\n";
  for(i = 0; i < rowCount; i++)
  {  
    //第一种方法取出@前面的用户名
    row = mysql_fetch_row( res );
    char buffer[1024],buffer2[1024];
    strcpy(buffer,row[0]);    
    char* p = strstr(buffer,"@");
    *p=0;
    cout <<"strstr="<<buffer<<"\t";

    //第二种方法取出@前面的用户名

    strcpy(buffer2,row[0]);
    char* p2 = strstr(buffer2,"@");
    int points= p2-buffer2;
    string buffer3=buffer2;
    cout<<"substr="<<buffer3.substr(0, points)<<endl;


    

  }
  cout <<"\n";

}

分离url里的get参数的键值~


[root@test geturi]# gcc geturi.c
[root@test geturi]# ./a.out
para1=val1
para2=val2
para3=val3

________________________________________________________________
头文件:#include <string.h>
strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:
char * strchr (const char *str, int c);
【参数】str 为要查找的字符串,c 为要查找的字符。
strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。
摘自:http://c.biancheng.net/cpp/html/161.html

strchr与strstr函数,strchr函数的语法格式怎么用?它的作用与strstr函数有什么区别?
在C语言中 strchr 和 strstr函数都被包含在<string.h>头文件中,也就是要调用它们时要在程序前面包含<string.h>头文件,也就是写这个语句:#include<string.h>
strchr函数原型:char * strchr(char * str, int ch); 功能就是找出在字符串str中第一次出项字符ch的位置,找到就返回该字符位置的指针(也就是返回该字符在字符串中的地址的位置),找不到就返回空指针(就是 null)。
strstr 函数原型: char * strstr(char * str1,char * str2);功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。

它们一个是求一个字符在字符串中得位置,另一个是求一个字符串在另一个字符串中的位置。
这些在C语言书最后面中都有的,你要学会去多看看书,要会自己解决问题。学编程是要有耐心的,学久了就会懂了。
来自:http://zhidao.baidu.com/link?url=sANNu-OqOB2bmhvJuBEOC1n7S8oeuSOoBcx47GsH0UcScIr3uMFXiZsQNtTu1MNkJGnHuTtCjrBrNdDEcLy2eq
分页: 249/271 第一页 上页 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 下页 最后页 [ 显示模式: 摘要 | 列表 ]