【c++】1、(使用strtok函数时while出不去)2、(ifstream+getline读取不到最后特定行数)

我写了一个翻译测试的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;
} 

哦,好了,解决了,如下

if (token!=0){
    t=-1;
    string l;
    strcpy(ch,a[i].tran[0].c_str());
    char *tokenPtr=strtok(ch,",");
    while (tokenPtr!=NULL){
        t++;
        a[i].tran[t]=tokenPtr;
        tokenPtr=strtok(NULL,",");
    }
}

其实我就只是把strtok放到了while最后而已,顺序颠倒一下,就可以了,很奇怪。
而且,我在strtok后面加一个cout,它就又不行了!

这也太离谱了……

文本文档如下:
priest
牧师
prose
散文
present
颁发,礼物
endeavor
努力
poetry
诗歌
end
end

并且第二个问题也随之不存在了…………………………