没有获取数组 Visual C++ 的所有元素
Not getting all the elements of an array Visual C++
我正在尝试将文本文件中的元素添加到数组中,我使用 strtok() 来拆分它们,然后尝试将它们添加到数组中,但由于某种原因,程序向我显示只有第一个 element.I 尝试了 for 和 while 的所有可能组合,但仍然无法解决它并获取所有元素。
input:Dan , 19 , male , 1.80 , 80 , normal , active , mentinere , normal
EDIT:after 我更改了程序将打印 7 次 "Dan" 的代码。
这是编辑后的代码:
#include <iostream>
#include <string.h>
#include<fstream>
using std::cout;
using std::string;
int main()
{
std::ifstream f("text.txt");
char* user;
user = new char[10];
char sep[] =",";
while (f>>user) {
string v[8];
for (int i = 0; i < 7; i++)
{char* p = strtok(user, sep);
v[i] = p;
while (p != NULL)
{
p = strtok(NULL, sep);
}
}
for (int i = 0; i < 7; i++)
{
cout << v[i] ;
}
}
return 0;
}
这个循环有缺陷:
for (int i = 0; i < 7; i++)
{char* p = strtok(user, sep);
v[i] = p;
while (p != NULL)
{
p = strtok(NULL, sep);
}
}
你真正想做的是这样的:
for (int index = 0, char *p = strtok(user, sep); index < 7 && p != nullptr; ++index, p = strtok(nullptr, sep)) {
v[index] = p;
}
你的内部循环几乎是正确的,因为你正确地调用了 strtok,但你没有将它存储在任何地方。而且你不需要嵌套循环。
您代码中的主要问题是该结构表明您想要读取一行,然后用 strtok
对其进行标记化。不幸的是 f >> user
(user
是 char*
)相当于 fscanf(f, "%s", user)
1,它告诉解析器跳过任何白色space 然后读取任何字符,一旦找到 space 就停止。
所以第一个循环只读取 Dan
,然后内部循环尝试解析它(如 Joseph Larson 回答中所述失败)。
所以,让我们尝试让您的代码正常工作。首先,它不能在我的机器上编译,因为你包括 <string.h>
而不仅仅是 <string>
.
那就不要把using std::cout;
和using std::string;
放在文件级别,而是放在函数内部,或者最好尽可能避免它们。
然后停止使用 char*
和 new
并切换到 std::string
。
然后用getline(f, user)
交换f >> user
(注意这是独立函数,不是std::stringclass的方法)。这将读取您将能够标记化的完整行。
你的循环真的关闭了。你可以这样做:
int i = 0;
char* p = strtok(&user[0], sep);
while (i < 8 && p != NULL) {
v[i] = p;
++i;
p = strtok(NULL, sep);
}
最后打印循环有一个错误,没有打印最后一个字。
总程序变为:
#include <iostream>
#include <string>
#include<fstream>
int main()
{
std::ifstream f("text.txt");
std::string user;
char sep[] = ",";
while (getline(f, user)) {
std::string v[8];
int i = 0;
char* p = strtok(&user[0], sep);
while (i < 8 && p != NULL) {
v[i] = p;
++i;
p = strtok(NULL, sep);
}
for (int i = 0; i < 8; i++) {
std::cout << v[i];
}
}
}
但我很确定您应该学习更多的 C++ 和更少的旧式 C 库。一个有趣的检查方法是 std::string::find_first_of()
.
1 当然 f
应该是 FILE*
才能工作。
我正在尝试将文本文件中的元素添加到数组中,我使用 strtok() 来拆分它们,然后尝试将它们添加到数组中,但由于某种原因,程序向我显示只有第一个 element.I 尝试了 for 和 while 的所有可能组合,但仍然无法解决它并获取所有元素。 input:Dan , 19 , male , 1.80 , 80 , normal , active , mentinere , normal EDIT:after 我更改了程序将打印 7 次 "Dan" 的代码。 这是编辑后的代码:
#include <iostream>
#include <string.h>
#include<fstream>
using std::cout;
using std::string;
int main()
{
std::ifstream f("text.txt");
char* user;
user = new char[10];
char sep[] =",";
while (f>>user) {
string v[8];
for (int i = 0; i < 7; i++)
{char* p = strtok(user, sep);
v[i] = p;
while (p != NULL)
{
p = strtok(NULL, sep);
}
}
for (int i = 0; i < 7; i++)
{
cout << v[i] ;
}
}
return 0;
}
这个循环有缺陷:
for (int i = 0; i < 7; i++)
{char* p = strtok(user, sep);
v[i] = p;
while (p != NULL)
{
p = strtok(NULL, sep);
}
}
你真正想做的是这样的:
for (int index = 0, char *p = strtok(user, sep); index < 7 && p != nullptr; ++index, p = strtok(nullptr, sep)) {
v[index] = p;
}
你的内部循环几乎是正确的,因为你正确地调用了 strtok,但你没有将它存储在任何地方。而且你不需要嵌套循环。
您代码中的主要问题是该结构表明您想要读取一行,然后用 strtok
对其进行标记化。不幸的是 f >> user
(user
是 char*
)相当于 fscanf(f, "%s", user)
1,它告诉解析器跳过任何白色space 然后读取任何字符,一旦找到 space 就停止。
所以第一个循环只读取 Dan
,然后内部循环尝试解析它(如 Joseph Larson 回答中所述失败)。
所以,让我们尝试让您的代码正常工作。首先,它不能在我的机器上编译,因为你包括 <string.h>
而不仅仅是 <string>
.
那就不要把using std::cout;
和using std::string;
放在文件级别,而是放在函数内部,或者最好尽可能避免它们。
然后停止使用 char*
和 new
并切换到 std::string
。
然后用getline(f, user)
交换f >> user
(注意这是独立函数,不是std::stringclass的方法)。这将读取您将能够标记化的完整行。
你的循环真的关闭了。你可以这样做:
int i = 0;
char* p = strtok(&user[0], sep);
while (i < 8 && p != NULL) {
v[i] = p;
++i;
p = strtok(NULL, sep);
}
最后打印循环有一个错误,没有打印最后一个字。
总程序变为:
#include <iostream>
#include <string>
#include<fstream>
int main()
{
std::ifstream f("text.txt");
std::string user;
char sep[] = ",";
while (getline(f, user)) {
std::string v[8];
int i = 0;
char* p = strtok(&user[0], sep);
while (i < 8 && p != NULL) {
v[i] = p;
++i;
p = strtok(NULL, sep);
}
for (int i = 0; i < 8; i++) {
std::cout << v[i];
}
}
}
但我很确定您应该学习更多的 C++ 和更少的旧式 C 库。一个有趣的检查方法是 std::string::find_first_of()
.
1 当然 f
应该是 FILE*
才能工作。