在C ++程序中使用strtok():为什么不检索文本文件的下一行?

时间:2016-02-02 20:20:10

标签: strtok

我正在编写C ++代码来读取包含单词行的文本文件。对于该文本文件中的每一行,我想标记字符串以删除空格。

例如,假设要读取的文本文件被调用" testlist.txt"内容是:

input1.txt\n    
_input2.txt_\n    
__input3.txt_\n   

下划线代表空格和' \ n'角色是看不见的。 程序输出应为:

input1.txt
input2.txt
input3.txt 

My Buggy Code

将输出以下代码:

Token:input1.txt.
Token:

第二次打印"令牌后没有换行:"。此外,我希望getline()获取testlist.txt的下一行并重复该过程,但程序完成执行/终止,没有错误/警告。

#include <iostream> 
#include <fstream>
#include <string.h>
#include <string> 

using namespace std;

int main() {

   string str_lineOutput;
   char* char_lineOutput, *tok; //str_lineOutput will be converted to char array  

   ifstream fp("testlist.txt"); //Open the file
   if(fp.is_open()) {
      while( getline(fp, str_lineOutput) ){ //Get the next line
         //Convert str_lineOutput to char_lineOutput which is what strtok() uses
         char_lineOutput = const_cast <char *> (str_lineOutput.c_str()); 
         //Remove spaces and line feed
         tok = strtok(char_lineOutput, " \n");
         while( tok != NULL){ 
             tok = strtok(NULL, " \n"); 
             cout << "Token:" << tok << ".\n";
         }
      }
      fp.close(); 
   }

   return 0; 
}

感谢那些查看我的代码或建议替代解决方案的人。我坚持实施是很重要的。

错误代码是在最内层循环中使用strtok()的结果。使while循环的主体运行的条件断言tok!= NULL,但我允许通过调用strtok()并将其分配给while循环体中的tok来取得NULL的可能性。

我期望tok!=在while循环体内的NULL。有趣的是,该程序刚刚停止并且从未实际完全终止,这与我试图尝试使用NULL的事实有关。

修复很简单:如果在内部strtok()之后,tok不是NULL,则在主体内运行代码。

2 个答案:

答案 0 :(得分:0)

如果你只是需要完成工作,这里有一个似乎有效的程序:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    const char *filePath = "E:\\temp\\foo.txt";
    std::ifstream is(filePath);
    std::string word;
    while (!is.eof())
    {
        is >> word;
        std::cout << "word: " << word << std::endl;
    }
    return 0;
}

如果您的目的是探索strtok(),当然,我的回答对您没有用处。

我测试的输入文件是:

  

FirstWord.txt
  SecondWord.txt
  ThirdWord.txt

输出是:

  

字:FirstWord.txt
  字:SecondWord.txt
  字:ThirdWord.txt
  字:ThirdWord.txt

答案 1 :(得分:0)

#include <iostream> 
#include <fstream>
#include <string.h>
#include <string> 

using namespace std;

int main() {

   string str_lineOutput;
   char* char_lineOutput, *tok; //str_lineOutput will be converted to char array  

   ifstream fp("testlist.txt"); //Open the file
   if(fp.is_open()) {
      while( !fp.eof() ){ //added this and moved getline inside
           getline(fp, str_lineOutput)//Get the next line
         //Convert str_lineOutput to char_lineOutput which is what
         //strtok() uses
         char_lineOutput = const_cast <char *> (str_lineOutput.c_str()); 
         //Remove spaces and line feed
         tok = strtok(char_lineOutput, " ");//took out new line char
         while( tok != NULL){ 
             //switch the order of these lines
             cout << "Token:" << tok << ".\n";
             tok = strtok(NULL, " "); //took out new line char here too
         }
      }
      fp.close(); 
   }

   return 0; 
}

对代码进行了一些更改,得到了以下结果:

Token:input1.txt.

Token:input2.txt.

Token:input3.txt.

如果没有额外的线条,我就是新来的......还在学习如何发布 答案正确。

我希望这会有所帮助。