我正在编写C ++代码来读取包含单词行的文本文件。对于该文本文件中的每一行,我想标记字符串以删除空格。
例如,假设要读取的文本文件被调用" testlist.txt"内容是:
input1.txt\n
_input2.txt_\n
__input3.txt_\n
下划线代表空格和' \ n'角色是看不见的。 程序输出应为:
input1.txt
input2.txt
input3.txt
将输出以下代码:
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,则在主体内运行代码。
答案 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.
如果没有额外的线条,我就是新来的......还在学习如何发布 答案正确。
我希望这会有所帮助。