Blate_ 2021-10-17 20:14 采纳率: 100%
浏览 24
已结题

【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;
} 
  • 写回答

3条回答 默认 最新

  • Blate_ 2021-10-18 21:18
    关注

    哦,好了,解决了,如下

    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,它就又不行了!

    这也太离谱了……

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月17日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持