我写了一个翻译测试的program(这不是重点)
其中有一步,需要将文本文件中读到的字符串分割成若干个子串(分隔符为‘,’),于是出现了两个问题
第一个问题,就是一个英文可能有多个翻译,所以这个分割成几份不确定,我是strtok分割
然后,while循环出不去……
如下(完整代码在后面)
if (token!=0){ //token是指逗号数
t=0;
strcpy(ch,a[i].tran[0].c_str());//a数组为结构体,i指第几个单词,tran[]是翻译(可以有多个)
char *tokenPtr=strtok(ch,",");//按模板写的
a[i].tran[0]=tokenPtr;
while (tokenPtr!=NULL){//出不去……
tokenPtr=strtok(NULL,",");
t++;
a[i].tran[t]=tokenPtr;
}
}
第二个问题,就是如果我强行在while执行一次后break,外面有一个for循环出不去 (我也不知道为什么总是循环出不去)
for (int i=0;i<1000;i++){
getline(in,a[i].word);//in是一个txt,我用的ifstream
if (a[i].word=="end"){//我在文本文档的最后写了两行end,三行也不行……
a[i].word="";
break;//如果在getline后面直接输出,会发现读不到end,不管多少个
}
getline(in,a[i].tran[0]);
for (int j=0;j<a[i].tran[0].length();j++){
if (a[i].tran[0][j]==','){
token++;
}
}
a[i].tra=token+1;//tra存放这个单词有几个中文翻译
if (token!=0){
t=0;
strcpy(ch,a[i].tran[0].c_str());
char *tokenPtr=strtok(ch,",");
a[i].tran[0]=tokenPtr;
while (tokenPtr!=NULL){
tokenPtr=strtok(NULL,",");
t++;
a[i].tran[t]=tokenPtr;
if (t==1){
break;
}
}
}
n++;
}
求帮助!
附上完整代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <cstring>
using namespace std;
string CharToStr(char * contentChar){
string tempStr;
for (int i=0;contentChar[i]!='\0';i++)
{
tempStr+=contentChar[i];
}
return tempStr;
}
void ModifyLineData(char* fileName,int lineNum,string lineData){
ifstream in;
in.open(fileName);
string strFileData="";
int line=1;
char tmpLineData[1024]={0};
while(in.getline(tmpLineData, sizeof(tmpLineData)))
{
if (line==lineNum)
{
strFileData+=lineData;
strFileData+="\n";
}
else
{
strFileData+=CharToStr(tmpLineData);
strFileData+="\n";
}
line++;
}
in.close();
//写入文件
ofstream out;
out.open(fileName);
out.flush();
out<<strFileData;
out.close();
}
struct w{
string word;
string tran[4];
int tra=0;
}a[1000];
int main(){
char c='c',ch[30]="";
int n=0,x=0,token=0,t=0;
ifstream in("tran库.txt");
if(in){
for (int i=0;i<1000;i++){
getline(in,a[i].word);
if (a[i].word=="end"){
a[i].word="";
break;
}
getline(in,a[i].tran[0]);
for (int j=0;j<a[i].tran[0].length();j++){
if (a[i].tran[0][j]==','){
token++;
}
}
a[i].tra=token+1;
if (token!=0){
t=0;
strcpy(ch,a[i].tran[0].c_str());
char *tokenPtr=strtok(ch,",");
a[i].tran[0]=tokenPtr;
while (tokenPtr!=NULL){
tokenPtr=strtok(NULL,",");
t++;
a[i].tran[t]=tokenPtr;
}
}
n++;
}
}
bool xc[n+4]={false};
/*for (int i=0;i<n;i++){
cout<<a[i].word<<" "<<a[i].tran[0]<<","<<a[i].tran[1]<<","<<a[i].tran[2]<<endl;
}*/
string ans;
srand((int)time(NULL));
/*for (int i=0;i<100;i++){
cout<<"word:";
cin>>a[i].word;
if (a[i].word=="end" or a[i].word=="End" or a[i].word=="quit"){
a[i].word="";
break;
}
cout<<"tran:";
cin>>a[i].tran;
n++;
}*/
cout<<"test begin"<<endl;
cout<<"choose a mode:"<<endl<<"print English or Chinese"<<endl<<"and if you want to quit,type'quit':";
string mode;
string ans1;
bool anr=false;
while (true){
bool q=false,k=false;
cin>>mode;
if (mode=="English"){
while (true){
anr=false;
srand((int)time(NULL));
x=rand()%n+0;
if (xc[x]==false){
xc[x]=true;
cout<<"the word is "<<a[x].word<<endl;
cout<<"input your answer:";
cin>>ans;
for (int i=0;i<4;i++){
// cout<<a[x].tran[i]<<"|";
if (ans==a[x].tran[i]){
cout<<"right"<<endl;
anr=true;
}
}
if (ans=="quit"){
cout<<"do you want to quit the whole program? type y or n:";
cin>>ans;
if (ans=="y"){
q=true;
}
break;
}
else if (anr==false){
cout<<"your answer may be wrong"<<endl<<"the right answer is ";
for (int i=0;i<a[x].tra;i++){
cout<<a[x].tran[i];
if (a[x].tra!=i+1){
cout<<",";
}
}
cout<<endl;
cout<<"if your answer is also right,input 'r'"<<endl;
cout<<"if it isn't,input 'w':"<<endl;
cin>>ans1;
if (ans1=="r"){
cout<<"ok,it has already been recorded"<<endl;
ModifyLineData("tran库.txt",2*x+2,a[x].tran[0]+a[x].tran[1]+a[x].tran[2]+','+ans);
}
}
if (q==true){
break;
}
}
for (int i=0;i<n;i++){
if (xc[i]==false){
break;
}
if (i==n-1&&xc[i]==true){
k=true;
}
}
if (k==true){
cout<<"all the word have been print,do you want to test again? print y or n:";
cin>>ans;
if (ans=="n"){
q=true;
break;
}
else if (ans!="y"){
cout<<"your input was wrong,default yes"<<endl;
}
xc[n+4]={false};
}
}
}
else if (mode=="Chinese"){
while (true){
srand((int)time(NULL));
x=rand()%n+0;
if (xc[x]==false){
xc[x]=true;
cout<<"the word is ";
for (int i=0;i<a[x].tra;i++){
cout<<a[x].tran[i];
if (a[x].tra!=i+1){
cout<<",";
}
}
cout<<endl;
cout<<"input your answer:";
cin>>ans;
if (ans==a[x].word){
cout<<"right"<<endl;
}
else if (ans=="quit"){
cout<<"do you want to quit the whole program? type y or n:";
cin>>ans;
if (ans=="y"){
q=true;
}
break;
}
else{
cout<<"your answer is wrong"<<endl<<"the right answer is "<<a[x].word<<endl;
}
if (q==true){
break;
}
}
for (int i=0;i<n;i++){
if (xc[i]==false){
break;
}
if (i==n-1&&xc[i]==true){
k=true;
}
}
if (k==true){
cout<<"all the word have been print,do you want to test again? print y or n:";
cin>>ans;
if (ans=="n"){
q=true;
break;
}
else if (ans!="y"){
cout<<"your input was wrong,default yes"<<endl;
}
xc[n+4]={false};
}
}
}
else if (mode=="quit"){
break;
}
else{
cout<<"your input was wrong,please type again:"<<endl;
}
if (q==true){
q=false;
break;
}
}
return 0;
}