C++ 用分隔符读取文件

C++ 用分隔符读取文件,c++,file-io,struct,C++,File Io,Struct,如何从文件中读入行并将该行的特定段指定给structs中的信息?我怎样才能在一个空行处停止,然后再继续,直到文件结束 背景:我正在构建一个程序,它将获取一个输入文件,读入信息,并使用双哈希将这些信息放入哈希表的正确索引中 假设我有一个结构: struct Data { string city; string state; string zipCode; }; 但文件中的行采用以下格式: 20 85086,Phoenix,Arizona 56065,Minneapoli

如何从文件中读入行并将该行的特定段指定给structs中的信息?我怎样才能在一个空行处停止,然后再继续,直到文件结束

背景:我正在构建一个程序,它将获取一个输入文件,读入信息,并使用双哈希将这些信息放入哈希表的正确索引中

假设我有一个结构:

struct Data
{
    string city;
    string state;
    string zipCode;
};
但文件中的行采用以下格式:

20

85086,Phoenix,Arizona
56065,Minneapolis,Minnesota

85281
56065

对不起,但我似乎仍然无法理解这一点。我很难读懂文件中的内容。第一行基本上是要构造的哈希表的大小。应忽略下一个空行。接下来的两行是应该进入结构并散列到哈希表中的信息。然后,应忽略另一个空行。最后,最后两行是需要匹配的输入,以查看它们是否存在于哈希表中。因此,在本例中,找不到85281。而56065被发现

您只需要函数
std::getline

比如说

std::string s;
std::getline( YourFileStream, s, ',' );
要将字符串转换为int,可以使用函数
std::stoi

或者,您可以读取整行数据,然后使用std::istringstream使用相同的函数std::getline提取每个数据。比如说

Data d = {};

std::string line;

std::getline( YourFileStream, line );

std::istringstream is( line );

std::string zipCode;

std::getline( is, zipCode, ',' );

d.zipCode = std::stoi( zipCode );

std::getline( is, d.city, ',' );
std::getline( is, d.state, ',' );

您可以使用
中的getline函数,如下所示:

string str;                      // This will store your tokens
ifstream file("data.txt");

while (getline(file, str, ',')   // You can have a different delimiter
{
     // Process your data

}
您还可以使用stringstream:

stringstream ss(line);           // Line is from your input data file
while (ss >> str)                // str is to store your token
{
     // Process your data here
}

这只是一个暗示。希望它能帮助您。

正如其他两个答案所指出的,您必须使用
std::getline
,但我会这样做:

if(std::getline(is,zipcode,,)&&
std::getline(is,city,,)&&
std::getline(is,state))
{
d、 zipCode=std::stoi(zipCode);
}
我所做的唯一真正的改变是将提取封装在
if
语句中,以便您可以检查这些读取是否成功。此外,为了方便地执行此操作(您不希望为每个
数据
对象键入上述内容),您可以将其放入函数中

您可以为
数据
类重载
>
运算符,如下所示:

std::istream&operator>>(std::istream&is,数据与数据)
{
std::字符串zipcode;
if(std::getline(is,zipcode,,)&&
std::getline(is,d.city,,)&&
std::getline(is,d.state))
{
d、 zipCode=std::stoi(zipCode);
}
回报是;
}
现在它变得非常简单,只需执行以下操作:

datad;
如果(标准::cin>>d)
{

std::cout那么这是否意味着逗号前的第一个块将存储在字符串s中?在这种情况下,它将是邮政编码?@user3399575不,它不是。正如我所说的,你需要将字符串转换为int类型的对象。请参阅我更新的帖子。这基本上只是一行代码吗?我如何确保它进入下一行?T他
std::stringstream
示例不使用逗号进行定界。当然不是。它从一行中取出空格,并将其拆分为可以在以后处理的标记。但他希望它停止在换行符上提取,而不仅仅是空格。请注意,标记不是关键字。在标记列表中填充与您的代码中相同的单词问题(double、hash、file、read)无助于对其进行分类。始终确保阅读选择标记时出现的描述!如果需要多行,可以使用某种循环机制(如
while()
loop)。有没有办法将zipcode转换为整数,即使邮政编码是M3M05?我想这需要转换为ASCII值,对吗?@user3399575“M3M05”的整数表示形式到底是什么be?你到底想把它转换成什么?一个数字。这个数字取决于zipcode。如果zipcode是“B3H2E8”,那么我希望转换成整数的过程会不同于M3M05的过程。@user3399575所以你基本上想“散列”这个值。你可以使用
std::hash
(即
d.zipCode=std::hash()(zipCode)
)。它返回的值为
std::size\u t
,因此您可能还需要将
zipCode
的类型更改为该类型。哦,我明白了。明白了!谢谢!