C++ 读取文本文件:读取多个值(如果存在)

C++ 读取文本文件:读取多个值(如果存在),c++,file-io,C++,File Io,我在试图让程序读取到文本文件中的一行末尾时遇到问题 我正在尝试从文本文件(每行一项)中读取以下格式(空格分隔的字段)的数据: 豪斯(12345) 类型(A=自动或M=电机循环) 牌照(星期三) 年份(2012年) 管理系统更新项目(23443) 这些数据将用于计算车辆登记总数 此时,程序正在读取上述格式的所有行,但是一个房屋可能有多个车辆,因此该行上有额外的数据(在这种情况下,除第一个字段外,所有字段都会重复)。 例如: 111111 A QWE123 2012 13222 M RTW234

我在试图让程序读取到文本文件中的一行末尾时遇到问题

我正在尝试从文本文件(每行一项)中读取以下格式(空格分隔的字段)的数据:

  • 豪斯(12345)
  • 类型(A=自动或M=电机循环)
  • 牌照(星期三)
  • 年份(2012年)
  • 管理系统更新项目(23443)
这些数据将用于计算车辆登记总数

此时,程序正在读取上述格式的所有行,但是一个房屋可能有多个车辆,因此该行上有额外的数据(在这种情况下,除第一个字段外,所有字段都会重复)。 例如:

111111 A QWE123 2012 13222 M RTW234 2009 9023

//     ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
//        first vehicle      second vehicle
一旦我到达一个包含额外数据的行,程序就不会读取它,进入一个无限循环。如何读取行中的附加数据以到达文件末尾并停止无限循环中的程序

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

using namespace std;

int main ()                   // Function Header
{                             // Start Function
    int house;
    char  type; 
    string license; 
    int year, msrp ; 
    char ch; 

    ifstream inData; 
    ofstream outData; 

    inData.open("register.txt"); 
    outData.open("vehicle.txt"); 

    inData >> house;               // Priming Read

    while (inData) {             // Test file stream variable

        do { 
            inData >> type;         
            inData >> license; 
            inData >> year;
            inData >> msrp; 

            outData << house << type << license << year << msrp << endl; 

            ch = inData.peek();
            inData >> house;

        } while(ch != '\n');            // Check for end of line 

    }                              // End while 

    system ("Pause");      
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()//函数头
{//启动函数
内特之家;
煤焦类型;
字符串许可证;
国际年,管理系统更新项目;
char ch;
Iftream inData;
数据流输出;
打开(“register.txt”);
outData.open(“vehicle.txt”);
inData>>house;//读取
while(inData){//测试文件流变量
做{
inData>>类型;
inData>>许可证;
因达塔>>年;
印度数据>>管理系统更新项目;

outData如果我正确理解您的问题,您可以使用下面的示例

如果首先读取
房屋
,然后读取
类型
许可证
年份
msrp

string line;
while (getline(inData , line))
{
    istringstream iss(line, istringstream::in);

    iss >> house;
    while (iss >> type >> license >> year >> msrp)
    {
      outData << house << type << license << year << msrp << endl; 
    }
}
字符串行;
while(getline(inData,line))
{
istringstream iss(行,istringstream::in);
国际空间站>>之家;
而(iss>>类型>>许可证>>年份>>msrp)
{

outData如果我正确理解您的问题,您可以使用下面的示例

如果首先读取
房屋
,然后读取
类型
许可证
年份
msrp

string line;
while (getline(inData , line))
{
    istringstream iss(line, istringstream::in);

    iss >> house;
    while (iss >> type >> license >> year >> msrp)
    {
      outData << house << type << license << year << msrp << endl; 
    }
}
字符串行;
while(getline(inData,line))
{
istringstream iss(行,istringstream::in);
国际空间站>>之家;
而(iss>>类型>>许可证>>年份>>msrp)
{

outData您的程序将很难检测到行尾。当它尝试读取“额外数据”但遇到下一行时,流上会发生错误,使您无法再次读取

您可以通过不读取内部循环中的
house
值来“修复”程序。相反,请在检测到行尾后读取它

        ch = inData.peek();
        //inData >> house;          // WRONG: house might be next vehicle type

    } while(ch != '\n');            // Check for end of line 

    inData >> house;                // CORRECT

}                              // End while 

但是,更好的处理方法可能是使用
getline
istringstream
。首先使用
getline
获取整行输入。将输入放入
istringstream
。然后,从中获取其余数据。有关这方面的说明,请参阅M.M.的版本。

您的程序将有一个很难处理的问题我正在检测行尾。当它试图读取“额外数据”但却遇到下一行时,流上会发生错误,使您无法再次读取

您可以通过不读取内部循环中的
house
值来“修复”程序。相反,请在检测到行尾后读取它

        ch = inData.peek();
        //inData >> house;          // WRONG: house might be next vehicle type

    } while(ch != '\n');            // Check for end of line 

    inData >> house;                // CORRECT

}                              // End while 

但是,更好的处理方法可能是使用
getline
istringstream
。首先使用
getline
获取整行输入。将输入放入
istringstream
。然后,从中获取其余数据。有关这方面的说明,请参阅M.M.的版本。

在C中?真的吗?
使用命名空间std;
?你试过在C语言中使用
fscanf
?真的吗?
使用命名空间std;
?你试过使用
fscanf
?谢谢用户315052,我很感谢你的解释。谢谢用户315052,我很感谢你的解释。