利用ifstream函数和strtok函数实现对txt文本内容的读写
例如某txt文件中内容为:
名称:304不锈钢
属性:金属
只想读取“:”后的内容,请问资深程序员们该如何实现
(每次写的代码均会读取全部内容)
int main()
{
ifstream in("D:\\test1.txt");
char buf[1000] = {0};
in>>buf;
while(strlen(buf) > 0)
{
char *p=strtok(buf,":");
if(p != NULL)
{
p=strtok(NULL,",");
if(p != NULL)
printf("%s\n",p);
}
in>>buf;
}
in.close();
return(0);
}
给你个通用的字符串拆分
#include <string>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
// 把字符串中的小写字母转换成大写,忽略不是字母的字符。
// str:待转换的字符串,支持char[]和string两种类型。
void ToUpper(char *str)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen=strlen(str);
for (int ii=0;ii<istrlen;ii++)
{
if ( (str[ii] >= 'a') && (str[ii] <= 'z') ) str[ii]=str[ii] - 32;
}
}
// 删除字符串左边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteLChar(char *str,const char chr)
{
if (str == 0) return;
if (strlen(str) == 0) return;
char strTemp[strlen(str)+1];
int iTemp=0;
memset(strTemp,0,sizeof(strTemp));
strcpy(strTemp,str);
while ( strTemp[iTemp] == chr ) iTemp++;
memset(str,0,strlen(str)+1);
strcpy(str,strTemp+iTemp);
return;
}
// 删除字符串右边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteRChar(char *str,const char chr)
{
if (str == 0) return;
if (strlen(str) == 0) return;
int istrlen = strlen(str);
while (istrlen>0)
{
if (str[istrlen-1] != chr) break;
str[istrlen-1]=0;
istrlen--;
}
}
// 删除字符串左右两边指定的字符。
// str:待处理的字符串。
// chr:需要删除的字符。
void DeleteLRChar(char *str,const char chr)
{
DeleteLChar(str,chr);
DeleteRChar(str,chr);
}
class CCmdStr
{
public:
vector<string> m_vCmdStr; // 存放拆分后的字段内容。
CCmdStr(); // 构造函数。
// 把字符串拆分到m_vCmdStr容器中。
// buffer:待拆分的字符串。
// sepstr:buffer中采用的分隔符,注意,sepstr参数的数据类型不是字符,是字符串,如","、" "、"|"、"~!~"。
// bdelspace:拆分后是否删除字段内容前后的空格,true-删除;false-不删除,缺省删除。
void SplitToCmd(const string buffer,const char *sepstr,const bool bdelspace=true);
// 获取拆分后字段的个数,即m_vCmdStr容器的大小。
int CmdCount();
~CCmdStr(); // 析构函数。
};
CCmdStr::CCmdStr()
{
m_vCmdStr.clear();
}
// 把字符串拆分到m_vCmdStr容器中。
// buffer:待拆分的字符串。
// sepstr:buffer字符串中字段内容的分隔符,注意,分隔符是字符串,如","、" "、"|"、"~!~"。
// bdelspace:是否删除拆分后的字段内容前后的空格,true-删除;false-不删除,缺省删除。
void CCmdStr::SplitToCmd(const string buffer,const char *sepstr,const bool bdelspace)
{
// 清除所有的旧数据
m_vCmdStr.clear();
int iPOS=0;
string srcstr,substr;
srcstr=buffer;
char str[2048];
while ( (iPOS=srcstr.find(sepstr)) >= 0)
{
substr=srcstr.substr(0,iPOS);
if (bdelspace == true)
{
memset(str,0,sizeof(str));
strncpy(str,substr.c_str(),2000);
DeleteLRChar(str,' ');
substr=str;
}
m_vCmdStr.push_back(substr);
iPOS=iPOS+strlen(sepstr);
srcstr=srcstr.substr(iPOS,srcstr.size()-iPOS);
}
substr=srcstr;
if (bdelspace == true)
{
memset(str,0,sizeof(str));
strncpy(str,substr.c_str(),2000);
DeleteLRChar(str,' ');
substr=str;
}
m_vCmdStr.push_back(substr);
return;
}
int CCmdStr::CmdCount()
{
return m_vCmdStr.size();
}
CCmdStr::~CCmdStr()
{
m_vCmdStr.clear();
}
int main(){
CCmdStr cmdStr;
cmdStr.SplitToCmd("content1|@|content2|@|content3|@|content4","|@|");
for (int i = 0; i <cmdStr.CmdCount() ; ++i) {
string a =cmdStr.m_vCmdStr[i];
std::cout<<a<<endl;
}
return 0;
}
输出:
供参考:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
char buffer[1024], *token;
string str;
ifstream ifs("test.txt");
if(!ifs){
cout<<"open file fail!"<<endl;
return 1;
}
while(getline(ifs,str))
{
strcpy(buffer,str.c_str());
token = strtok(buffer,":");
if(token != NULL)
token = strtok(NULL,":");
cout<<token<<endl;
}
ifs.close();
return 0;
}
关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:C++ ifstream、sstream按行读取txt文件中的内容,并按特定字符分割,不用strtok