大家早上好,:))
我在C ++中编写了一个从txt文件中读取信息的代码。它将第一行中的信息保存为字符串,然后我想使用此信息。我想读这个字符串,当它找到“|”时它必须跳到一个新的字符串。它很容易,但我在执行时遇到问题,我一直试图找到问题好几个小时而且我还没有成功。 :(我附上了代码。
提前感谢您的帮助。
#include <string>
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
ifstream ifs( "C:\\a\\text.txt" );
string temp;
getline( ifs, temp );
cout<<temp<<endl;
string * pch;
pch = strtok (temp,"|");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, "|");
}
system("pause");
return 0;
}
答案 0 :(得分:1)
strtok适用于char *,而不是字符串* 。这可能是您遇到问题的原因。
由于您使用c ++实现此功能,我建议您使用字符串函数而不是strtok:
int main()
{
ifstream ifs( "C:\\a\\text.txt" );
string temp;
getline( ifs, temp );
cout<<temp<<endl;
size_t tokenPos = temp.find("|");
while (tokenPos != string::npos)
{
cout << temp.substr(0, tokenPos) << endl;
temp.erase(0, tokenPos+1);
tokenPos = temp.find("|");
}
system("pause");
return 0;
}
要将文字存储在评论中描述的值中,您需要执行以下操作:
int main()
{
ifstream ifs( "C:\\a\\text.txt" );
int id;
int type;
int columns;
string temp;
getline( ifs, temp );
cout<<temp<<endl;
size_t tokenPos = temp.find("|");
while (tokenPos != string::npos)
{
int i=0;
tokenPos = temp.find("|");
cout << temp.substr(0, tokenPos) << endl;
if(i==0)
{
id = atoi(temp.substr(0, tokenPos).c_str());
}
else if(i==1)
{
type = atoi(temp.substr(0, tokenPos).c_str());
}
else if(i==2)
{
columns = atoi(temp.substr(0, tokenPos).c_str());
}
++i;
temp.erase(0, tokenPos+1);
}
cout << "ID: " << id << ", Type: " << type << ", Columns: " << columns << endl;
system("pause");
return 0;
}
答案 1 :(得分:1)
有许多方法可以标记std :: string。这是一种方式;我选择这个主要是因为它简单且独立:
int main() {
using namespace std;
ifstream ifs("C:/a/text.txt");
vector<string> bits; // if you want to save to process
for (string temp; getline(ifs, temp, '|');) {
bits.push_back(temp);
cout << temp << '\n'; // if you want to output each as processed
}
return 0;
}
答案 2 :(得分:0)
您可以在question中找到一些方法。当您使用C ++时,通常不是诉诸C风格函数的方法。关于您的代码,请尝试向我们提供确切的错误。它有帮助...
我在你的代码中看到了很多问题。以下是C++ reference的一个工作示例:
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
正如文档中所述,你需要给strtok一个非const c-string,因为它会修改它以处理令牌。
MY2C
答案 3 :(得分:0)
尝试更改此行
pch = strtok (temp,"|");
到
pch = strtok (temp.c_str(),"|");
strtok取char *(c-style string)not :: std :: string(c ++ string)。
<强> UPDATE2 强> 我的错。我没有用过strtok这么久。 好。 试试这个:
char* s = new char[temp.size() + 1];
memcpy(s, temp.c_str(), temp.size() + 1); // copy c-style string with '\0' at the end
const char* pch = strtok(s, "|");
...
delete[] s;