C++程序读oracle 主机字符串表里的字符串怎么读?...

您所在的位置: &
C++中英文字符串基本概念解析
C++中英文字符串基本概念解析
C++中英文字符串之间有些什么关联呢?我们将会在这篇文章中通过各种不同的代码示例来为大家详细介绍有关这方面的知识。
编程语言中的字符串应用在实际编程中是一个比较基础的应用技术。&我们在学习这门语言的时候,需要对这方面的知识有一个充分的掌握。在这里我们就一起来了解一下C++中英文字符串的表示方法。
在C++中英文字符串类的string的模板原型是basic_string
template&& &_Elem,&class&traits&=&char_traits& ,&class&_Ax&=&allocator& &class&basic_string{};&
第一个参数_Elem表示类型。第二个参数traits的缺省值使用char_traits类型,定义了类型和字符操作的函数,如比较、等价、分配等。第三个参数_Ax的默认值是allocator类,表示了内存模式,不同的内存结构将操作指针的不同行为,例如栈、堆或段内存模式等。
在C++标准里定义了两个字符串string和wstring
typedef&basic_string& & &typedef&basic_string& &&
前者string是常用类型,可以看作char[],其实这正是与string定义中的_Elem=char相一致。而wstring,使用的是wchar_t类型,这是宽字符,用于满足非ASCII字符的要求,例如Unicode编码,中文,日文,韩文什么的。对于wchar_t类型,实际上C++中都用与char函数相对应的wchar_t的函数,因为他们都是从同一个模板类似于上面的方式定义的。因此也有wcout, wcin, werr等函数。
实际上string也可以使用中文,但是它将一个汉字写在2个char中。而如果将一个汉字看作一个单位wchar_t的话,那么在wstring中就只占用一个单元,其它的非英文文字和编码也是如此。这样才真正的满足字符串操作的要求,尤其是国际化等工作。
看一下下面的程序,就会理解C++中英文字符串之间的差别。
#include&&&#include&&&using&namespace& &#define&tab&&\t& &int&main() &{ &locale& &cout&&()&&; &locale&current&=&cout.getloc(); &cout&&()&&; &float&val=1234.56; &cout&&&&; &//chage&to&french/france &cout.imbue(locale(&chs&)); &current=cout.getloc(); &cout&&()&&; &cout&&&&; &//上面是说明locale的用法,下面才是本例的内容,因为其中用到了imbue函数 &cout&&&*********************************&&&; &//为了保证本地化输出(文字/时间/货币等),chs表示中国,wcout必须使用本地化解析编码 &wcout.imbue(std::locale(&chs&)); &//string&英文,正确颠倒位置,显示第二个字符正确 &string&str1(&ABCabc&); &string&str11(str1.rbegin(),str1.rend()); &cout&&&UK\ts1\t:&&&&&&&[1]&&&&&&; &//wstring&英文,正确颠倒位置,显示第二个字符正确 &wstring&str2=L&ABCabc&; &wstring&str22(str2.rbegin(),str2.rend()); &wcout&&&UK\tws4\t:&&&&&&&[1]&&&&&&; &//string&中文,颠倒后,变成乱码,第二个字符读取也错误 &string&str3(&你好么?&); &string&str33(str3.rbegin(),str3.rend()); &cout&&&CHN\ts3\t:&&&&&&&[1]&&&&&&; &//正确的打印第二个字符的方法 &cout&&&CHN\ts3\t:RIGHT\t&&&[2]&&[3]&&; &//中文,正确颠倒位置,显示第二个字符正确 &wstring&str4=L&你好么?&; &wstring&str44(str4.rbegin(),str4.rend()); &wcout&&&CHN\tws4\t:&&&&&&&[1]&&&&&&; &wstring&str5(str1.begin(),str1.end());//只有char类型的string时才可以如此构造 &wstring&str55(str5.rbegin(),str5.rend()); &wcout&&&CHN\tws5\t:&&&&&&&[1]&&&&&&; &wstring&str6(str3.begin(),str3.end());//如此构造将失败!!!! &wstring&str66(str6.rbegin(),str6.rend()); &wcout&&&CHN\tws6\t:&&&&&&&[1]&&&&&&; &return&0; &}&
以上就是我们对C++中英文字符串的相关介绍。
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
Linux之父对C++进行了炮轰,说它是糟糕程序员的垃圾语言,可谓是
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
今天是被国际上众多科技公司和软件企业承认的业内人士
互联网一大真理便是,有痛点的地方就有机会。现在最想
Eclipse 是一个开源的、可扩展的集成开发环境。平台本
《网管员必读―服务器与数据存储》全面、系统地介绍了在中、高级网络管理和网络工程实施中两个重要方面的主流技术和应用:硬件服
51CTO旗下网站1170人阅读
Oracle(R) C++ Call Interface (OCCI) 是一套应用程序编程接口,它允许C++程序与一个或者多个Oracle数据库进行交互.OCCI给予你强大的数据库操作能力,比如说执行SQL,处理存储过程等.
OCCI主要是提供给有以下需求的用户:
希望借助系统内存和网络连接的合理使用,开发高性能的应用程序.开发可伸缩的应用程序,以满足数据库用户和请求的不断增长.支持访问数据库对象.简化用户认证和密码管理.支持多层认证模式两层C/S环境或者多层环境下,动态连接管理和事务管理的一致性接口.
注: OCCI不支持Non-Blocking(非阻塞)模式.
由于OCCI是以动态库方式导出的类库,因此对平台和编译器的依赖性比较强,所以需要根据不同平台,不同编译器取得对应的OCCI接口,并且在自己的程序中链接OCCI的库:
一般情况下OCCI会随着oracle数据安装,附带安装到某个目录下,不过对于仅仅需要做相关开发的人员来说,这个动作”太大了”,选择安装即时客户端是一个不错的选择,小巧,便于配置,功能完善(对于应用程序开发来说).
我们需要到oracle的网站上下载以下几个东西:
instantclient-basic (一些基础组件)instantclient-sdk (开发包,即相关的头文件和库文件)occi (能正确匹配你的开发环境的OCCI库)&&&&&&&&&&&&&&&&&&&&&&&
虽然instantclient-sdk里已经有了lib和头文件,但occi仍然需要单独下载,因为
instantclient-sdk 只有发行版本的lib和动态库,对于开发和调试来说是不够的.
instantclient-sdk 中的动态库不能直观的判断其CRT库的依赖版本
有一个地方还需要注意,OCCI版本并不是很全,因为它有太多的东西需要对号入座,如开发者的编译器类型,编译器版本,操作系统(x86,x64),Oracle客户端(包含即使客户端)版本.所以尽管OCCI有不少的发行版本,但轮到你具体选择的时候就不多了,比如说你想找支持VC2008的OCCI,你就只能选Oracle11的客户端了,因为Oracle只发行了这样一个版本同支持VC2008.
回到安装的话题上,假设你用windows +VC2008,你需要下载 instantclient-basic-win32-11.1.0.6.0.zip,instantclient-sdk-win32-11.1.0.6.0.zip,occivc9win32_111060.zip.为什么要选11.0.6这个版本?因为我们的开发环境决定了只能找到11.1.6.0这个版本的OCCI库.
先将下载到的instantclient-basic 解压到C:\ora_env.那么它下面应该有vc8;vc8;vc71这4个文件夹.将instantclient-sdk-win32-11.1.0.6.0.zip中的sdk目录放在C:\ora_env下.在C:\ora_env下新建文件夹vc9,将occivc9win32_111060.zip中的4个文件(oraocci11.dll,oraocci11d.dll,oraocci11.dll.manifest,oraocci11d.dll.manifest)放在里面.在C:\ora_env\sdk\lib\msvc下新建目录vc9,将occivc9win32_111060.zip中的 oraocci11.lib,oraocci11d.lib放在这个目录里.将C:\ora_env\vc9;C:\ora_加入PATH环境变量(最好放在前面).新建一个环境变量TNS_AMDIN,值为C:\ora_env\;tnsnames.ora文件应该放在这个目录下.新建一个环境变量NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK(这个值根据自己的情况定).删除C:\ora_env下的oraocci11.dll和oraocci11.sym,这个库文件不是链接到VC2008的CRT,C:\ora_env\vc9才是正确的DLL,同时也能更明确表达我们的是使用VC2008开发环境的这样一个情况.C:\ora_env\sdk\lib\msvc下的oraocci11.lib 也应该删除,原理同上.将C:\ora_env\sdk\lib\msvc\vc9加入VC2008库文件搜索路径.将C:\ora_env\sdk\include加入VC2008头文件搜索路径.
linux下的配置过程基本一样,但动态库文件(.so)的路径(对应于windows环境下的C:\ora_env\vc9)应该加入到LD_LIBRARY_PATH环境变量中.
配置工作做完后,可以写一点代码,测试一下
代码中的数据库连接字符串跟一般我们常用的有点不同,连接字符串可以有下面两种写法:
host:[port][/service name](DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=127.0.0.1) (PORT=5521))
(CONNECT_DATA=(SERVICE_NAME=SRV_NAME)))
第二种就是跟tnsnames.ora中的内容一样的了.
常见错误处理
分享一些在开发和测试的过程中,经常会遇见一些常见的问题(win + VC).
编译代码时,发现大量错误,都是说某些CRT函数名称重复.
原因中多半是同一个项目静态链接了两个不同版本的CRT库.比如VC2005的程序A依赖VC2008的程序B(B使用OCCI),B的代码生成方式为/MT或者/MTd.
将上面的场景中,程序B的代码生成方式改成/MD或者/MDd后,编译通过,但是程序运行发生崩溃.
很可能是代码中的某个对象产生和释放分别调用了不同的CRT(一个是VC2005的,一个是VC2008的).解决办法:没有什么好的解决办法,最好还是统一开发环境吧,C++导出的类不适合跨环境.
出现ORA-24960错误
你的项目是debug版本,但链接了release版本的occi库.
出现R6034错误
OCCI库跟你的VC版本不一致.
调试时,发现堆栈被莫名其妙的破坏
同上,或者OCCI的debug与release版本跟当前项目的设置不匹配.
找不到MSVCR90.DLL
记得让你的客户安装VC9的redist.
找不到MSVCR90D.DLL
你发布的程序是调试版本的,虽然你的用户安装了VC9的redist,那也是没用的,因为redist只会安装release版本的运行时库.
Oracle C++ Call Interface 这是oracle官方的参考资料,有待学习~
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61671次
排名:第19505名
原创:25篇
转载:41篇
(2)(1)(1)(1)(2)(5)(8)(5)(6)(2)(10)(9)(5)(1)(5)(2)(5)4150人阅读
1)问题描述
C++读取一个文本文件时,直接用流的 && 方法会自动把空白符作为输入的分界符,所以如下代码存在问题
ifstream infile(&xxx.txt&,ios::in);
while(!infile.eof()){
infile&&c;
while( (c!=' ') && (c!='\t') && (c!='\n') ){
word[pos]=c;
infile&&c;
word[pos]='\0';
if(pos!=0){
cout&&word&&
比如有test.txt文件
my name is zhccl
当用&infile&&c 读到 &my& 的 “y” 之后,下一个会自动滤过 空格符 因为空格符是作为一个标准输入的非有效字符,下一次会读入 ”n“ 所以整段代码会读入word=”mynameiszhccl“
并不会分别读到 my,name,is,zhccl
2)解决方案
1.用 infile.getline(),来解决,一次读到一个 &\n& 为止,再来用空白符作为分界符来解释 &word[]&
2.用 infile&& 来强制读入每一个字符,不过滤空白符,包括换行符。
代码如下:
* 从文件中读取字符,不忽略空白符
#include &iostream&
#include &fstream&
int main(){
ifstream infile(&d:\\f2.txt&,ios::in); //以输入方式打开文件
//判断是否打开成功
if(!infile) {
cerr&&&open error!&&&
char word[50];
//从文件逐个读取字符存放到c中,最终放到word数组中
//不忽略空白符,也不忽略每行最后那个'\n'
while(!infile.eof()){
infile&&c;
while( (c!=' ') && (c!='\t') && (c!='\n') ){
word[pos]=c;
infile&&c;
word[pos]='\0';
if(pos!=0){
cout&&word&&
infile.close();
这儿有点问题,就是文件最后必须是一个 ”\n“ ,否则程序会崩溃,我正在纳闷这一点。
持续更新:
找到原因了,在文件 &test.txt&
my name is zhccl
当准备读 ”zhccl“ 时,此时while(!infile.eof())判断通过,然后会一直读,infile&&c 知道已经读到文件结尾了,此时infile=0,我们并没有去验证inflie是否到末尾,所以c的值保持前一次读入字符 ”l“ ,并不从文件读入字符来更新,即最后一个读入的字符串为”zhccllllllllllll.....“ 直到 word[] 溢出,出错。
改正方法:
检查infile情况
while(!infile.eof()){
infile&&c;
while( (c!=' ') && (c!='\t') && (c!='\n') ){
word[pos]=c;
if( (infile&&c)==0){
word[pos]='\0';
或者二次检查是否到文件结束
while(!infile.eof()){
infile&&c;
while( (c!=' ') && (c!='\t') && (c!='\n') && (!infile.eof())){
word[pos]=c;
word[pos]='\0';
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:34201次
排名:千里之外
原创:37篇
转载:11篇
评论:27条
(1)(1)(3)(1)(3)(1)(1)(1)(1)(9)(18)(9)c++中如何利用vector&fstream进行文件的读取
#include&iostream&
#include &string&
#include &vector&
#include &fstream&
#include &sstream&
int filetovector(string
filename,vector&string&&
&& ifstream
infile(filename.c_str());
&& if(!infile)
&&& return
(getline(infile,s))
sevc.push_back(s);
&infile.close();&&
//--关闭文件
(infile.eof())&//--遇到文件结束符
& return 4;
&if(infile.bad())
//--&发生系统故障
& return 2;
&if(infile.fail())&//读入数据失败
& return 3;
int t_main(int argc, char *argv[])
vector&string&
string filename,s;
//读入文件名
cout&&"Entet the FileName :";
//处理文件
switch(filetovector(filename,sevc))
cout&&"error:can't open file:"
&&filename&&
return -1;
cout&&"error:system
failure"&&
& cout&&"error:read
failure"&&
& return -1;
&return 1;
//使用istringstream从vector里每次读取一个单词的形式读取所存储的行
for(vector&string&::iterator
iter=sevc.begin();iter!=sevc.end();++iter)
&isstream.str(*iter);
(isstream&&s)
&&cout&&s&&
&isstream.clear();
//--将istringstream流设置为有效状态
getline()是按行读取的,
isstream&&s&
从流中读取字符串到s 注意
此时流中字符串是以行存储的当读到s中的时候遇到空格就结束读取(开头的空格不算),然后循环读取下空格下一个位置的字符串
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何将文本文件中两个空格键的字符串读入c/c++程序_百度知道
如何将文本文件中两个空格键的字符串读入c/c++程序
比如temp.txt中写:AAA BBB CCC将这三个字符串分别存入程序的a,b,c中!
AAA(空格)BBB(空格)CCC
提问者采纳
//我的程序可以读以下形式的数据,主要实现了两个不定长//1,空格不定长;2,空格隔开的数据补丁长。://
temp.txt //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaa(n个空格)a aaaaaaaaaaaaaaaaaa(n个空格)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(n个空格)aaaaaaa#include &stdio.h&#include &stdlib.h&#include &string.h&#define BUF_SIZE 100#define oops do{perror(&error&);exit(-1);}while(0)
//出错处理,返回-1//数据的链表,因为你的数据长度不可知,所以,我选择用链表处理typedef struct LinkNode{
char * struct LinkNode *}*LinkL int read_data(LinkList *L,FILE *fp);
void Add2List(LinkList *Ltail,char *data,int length,int cat);void show_data(LinkList L);void main(){ LinkList L=NULL; FILE * if((fp = fopen(&temp.txt&,&r&))==NULL)
read_data(&L,fp); show_data(L-&next );}//显示链表中的数据void show_data(LinkList L){ while(L) {
printf(&%s\t%d\n&,L-&cdata ,L-&length );
L= L-& }}//把文件中的数据读入链表int read_data(LinkList *L,FILE *fp){ size_t readbytes = 0,i = 0,j = 0; int line_cat = 0; long file_ LinkList Ltail = NULL;
fseek(fp,0,SEEK_END); file_len = ftell(fp); fseek(fp,0,SEEK_SET);
//这三行用来获得文件长度
//头结点为空,然后头结点后的都用来存储数据。 if((*L = Ltail = (LinkList)malloc(sizeof(struct LinkNode))) == NULL)
char buf[1025]; while((file_len -= readbytes) != 0) //若发现读完,则退出 {
if((readbytes = fread(buf,1,1024,fp)) == -1)
buf[readbytes] = 0;
while( i & readbytes)
if(buf[i]==' ') //若当前字符串为空格,则
//插入有j -& i 的数据至
buf[i] = 0;
if(line_cat) //判断前面读的一行,是否没有空格,如果前面一行无空格,则把此数据连接到当前尾节点的字符,如果有空格则新建一个节点,并把数据复制到节点
Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
Add2List(&Ltail,&buf[j],i-j,0);
while(buf[++i] == ' ') ;
if(j == 0 ) //如果整行都没有发现空格,则把数据保存。
if(line_cat) //同上。
Add2List(&Ltail,&buf[j],i-j,1);
line_cat = 0;
Add2List(&Ltail,&buf[j],i-j,0);
line_cat = 1;
} } return 0;}//保存字符串data到链表中。cat指示数据是否连接到当前节点,还是复制到新建的节点。void Add2List(LinkList *Ltail,char *data,int length,int cat){ if(!cat) {
if(((*Ltail)-&next = (LinkList )malloc(sizeof(struct LinkNode))) == NULL)
*Ltail = (*Ltail)-&
if(((*Ltail)-&cdata = (char *)malloc(length + 1)) == NULL)
strcpy((*Ltail)-&cdata ,data);
(*Ltail)-&next = NULL;
(*Ltail)-&length = } else {
if(((*Ltail)-&cdata = (char *)realloc((*Ltail)-&cdata ,strlen((*Ltail)-&cdata )+length + 1)) == NULL)
strcat((*Ltail)-&cdata ,data);
(*Ltail)-&length += } }//最后程序没有释放内存,楼主可以自己释放试试。还有,此程序有点难度,新手可能比较难懂。嘻嘻。
其他类似问题
空格键的相关知识
其他3条回答
cin&&a;cin.get();cin&&c;cin.get();cin&&b;cin.get();
用strstr查找函授,按空格查找。比如 char *index = NULL;char *str= &AAA BBB CCC&;index = strstr(str,& &);就可以得到空格的位置。memcpy(a,str,index-str)其他类似。给你方法,学会如何解决问题
如果是C++可以用cin.getlinf&&( , )
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 oracle 主机字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信