从文件中读取项目时遇到问题 (C++)
Having trouble reading items from a file (C++)
所以,我无法将文本文件中的最后一项读入字符串对象。
我创建了一个名为 "Car," 的 class,我应该从文件中读取 "Car" 对象的所有参数,但它不会'不要注册最后一个。
ifstream 对象是 "data"
变量是:
string carType;
string reportingMark;
int carNumber;
string kind;
bool loaded;
string destination;
文本文件中的行内容如下:
Car CN 819481 maintenance false NONE
这是我现在拥有的:
getline(data, ignore); // ignores the header line
data >> carType >> reportingMark >> carNumber >> kind >> loaded;
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
data.get();
getline(data, destination);
因此,它将读取除 "destination" 部分以外的所有内容。
代码似乎是正确的;除了我认为没有必要把
while (data.peek() == ' ')
data.get();
getline(data, destination);
部分读取目的地。相反,您可以简单地将其读取为数据 >> 目的地。
此外,通过检查
确保您的输入文件正确打开
if(data.isOpen()){//cout something}
希望对您有所帮助! :)
检查所有 IO 操作的 return 值总是好的。如果添加错误检查,您可能能够找到问题并找到解决方案。
if (!getline(data, ignore)) // ignores the header line
{
std::cerr << "Unable to read the header\n";
exit(EXIT_FAILURE);
}
if ( !(data >> carType >> reportingMark >> carNumber >> kind >> loaded))
{
std::cerr << "Unable to read the data\n";
exit(EXIT_FAILURE);
}
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
data.get();
if ( !getline(data, destination) )
{
std::cerr << "Unable to read the rest of the line\n";
exit(EXIT_FAILURE);
}
给你的 "ifstream" 对象一个 while 循环怎么样,像这样
ifstream ifstreamObject;
ifstreamObject.open("car.txt");
cout << "carType"<< ' '<< "reportingMark" << ' '<< "carNumber" <<' '<< "kind" <<' '<< "loaded"<<' '<<"destination"<< endl;
while(ifstreamObject >> carType >> reportingMark >> carNumber >> kind >> loaded >> destination )
{ cout <<"---------------------------------------------------------------------------"<<endl;
cout << carType<< ' '<< reportingMark << ' '<< carNumber <<' '<< kind <<' '<< loaded<<' '<<destination<< endl;
}
问题出在这部分:
data >> carType >> reportingMark >> carNumber >> kind >> loaded;
在这里,您尝试从流中读取布尔变量 loaded
。您希望阅读 false
会起作用,但它不起作用。它只接受 0
或 1
。
相反,未能读取布尔变量将切换流的 err
位,这使得读取其他所有内容失败。
要检查这一点,如果您在该行之后立即执行 data.peek()
,您将收到 -1
,表示没有有效输入。
要解决此问题,您需要更改存储信息的方式以存储 0/1
而不是 true/false
,或者更好:
在读取数据之前执行:data << boolalpha
。这将使流将 true/false
解释为 0/1
.
如果我是你,我会尝试使用 strtok 函数从文件中读取。
如果你愿意,可以阅读这篇文章了解更多信息strtok function
我最近完成了这个任务,我使用了strtok,因为它允许将文件的每一行拆分成一个单词列表。另外,它可以让你避免分配空格等标点符号。(所以我发现它非常有用)
我的例子:我想从一个文件中读取一些角色数据,比如种族,职业,生命值,攻防等。
我的文件的每一行都是这样的:Human/soldier/15/7/7
因此,我定义了一个 char 指针,用于存储 strtok 函数的 return 值,以及一个 char 指针,用于存储读取的单词,直到找到您之前考虑过的分隔符。 (在这个例子中:'/')
char* position = strtok(file, '/');
char* character_info = new char[size];
因此,您将行存储在 character_info 中,并在每次迭代中检查位置值,直到完成读取文件。
while(position != NULL){
// store position value
// call again strtok
}
希望对您有所帮助! =)
干杯
所以,我无法将文本文件中的最后一项读入字符串对象。
我创建了一个名为 "Car," 的 class,我应该从文件中读取 "Car" 对象的所有参数,但它不会'不要注册最后一个。
ifstream 对象是 "data"
变量是:
string carType;
string reportingMark;
int carNumber;
string kind;
bool loaded;
string destination;
文本文件中的行内容如下:
Car CN 819481 maintenance false NONE
这是我现在拥有的:
getline(data, ignore); // ignores the header line
data >> carType >> reportingMark >> carNumber >> kind >> loaded;
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
data.get();
getline(data, destination);
因此,它将读取除 "destination" 部分以外的所有内容。
代码似乎是正确的;除了我认为没有必要把
while (data.peek() == ' ') data.get();
getline(data, destination);
部分读取目的地。相反,您可以简单地将其读取为数据 >> 目的地。 此外,通过检查
确保您的输入文件正确打开if(data.isOpen()){//cout something}
希望对您有所帮助! :)
检查所有 IO 操作的 return 值总是好的。如果添加错误检查,您可能能够找到问题并找到解决方案。
if (!getline(data, ignore)) // ignores the header line
{
std::cerr << "Unable to read the header\n";
exit(EXIT_FAILURE);
}
if ( !(data >> carType >> reportingMark >> carNumber >> kind >> loaded))
{
std::cerr << "Unable to read the data\n";
exit(EXIT_FAILURE);
}
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
data.get();
if ( !getline(data, destination) )
{
std::cerr << "Unable to read the rest of the line\n";
exit(EXIT_FAILURE);
}
给你的 "ifstream" 对象一个 while 循环怎么样,像这样
ifstream ifstreamObject;
ifstreamObject.open("car.txt");
cout << "carType"<< ' '<< "reportingMark" << ' '<< "carNumber" <<' '<< "kind" <<' '<< "loaded"<<' '<<"destination"<< endl;
while(ifstreamObject >> carType >> reportingMark >> carNumber >> kind >> loaded >> destination )
{ cout <<"---------------------------------------------------------------------------"<<endl;
cout << carType<< ' '<< reportingMark << ' '<< carNumber <<' '<< kind <<' '<< loaded<<' '<<destination<< endl;
}
问题出在这部分:
data >> carType >> reportingMark >> carNumber >> kind >> loaded;
在这里,您尝试从流中读取布尔变量 loaded
。您希望阅读 false
会起作用,但它不起作用。它只接受 0
或 1
。
相反,未能读取布尔变量将切换流的 err
位,这使得读取其他所有内容失败。
要检查这一点,如果您在该行之后立即执行 data.peek()
,您将收到 -1
,表示没有有效输入。
要解决此问题,您需要更改存储信息的方式以存储 0/1
而不是 true/false
,或者更好:
在读取数据之前执行:data << boolalpha
。这将使流将 true/false
解释为 0/1
.
如果我是你,我会尝试使用 strtok 函数从文件中读取。
如果你愿意,可以阅读这篇文章了解更多信息strtok function
我最近完成了这个任务,我使用了strtok,因为它允许将文件的每一行拆分成一个单词列表。另外,它可以让你避免分配空格等标点符号。(所以我发现它非常有用)
我的例子:我想从一个文件中读取一些角色数据,比如种族,职业,生命值,攻防等。
我的文件的每一行都是这样的:Human/soldier/15/7/7
因此,我定义了一个 char 指针,用于存储 strtok 函数的 return 值,以及一个 char 指针,用于存储读取的单词,直到找到您之前考虑过的分隔符。 (在这个例子中:'/')
char* position = strtok(file, '/');
char* character_info = new char[size];
因此,您将行存储在 character_info 中,并在每次迭代中检查位置值,直到完成读取文件。
while(position != NULL){
// store position value
// call again strtok
}
希望对您有所帮助! =)
干杯