将文件读入以逗号和换行符分隔的向量
Posted
技术标签:
【中文标题】将文件读入以逗号和换行符分隔的向量【英文标题】:Reading File into Vector Delimited by Comma and New Line 【发布时间】:2015-11-23 21:45:54 【问题描述】:假设我想读取一个 .txt 文件并以这种方式格式化
Max,1979
Wade,1935
Hugh,1983
Eric,1936
这是我使用的代码
-
读入文件。
将其存储到字符串和 int 的向量中(分别用于姓名和年份)
void calcAges()
while (getline(infile, line, ','))
names.push_back(line);
years.push_back(line);
void printNames()
cout << "\n\tDisplaying data...\n";
for (int i = 0; i < counter; i++)
cout << (i + 1) << ".\tName: " << names[i] << "\tYear: " << years[i] << endl;
输出应如下所示:
1. Name: Max Year: 1979
.
.
.
and so on...
但是,我在尝试制作它时遇到了麻烦,因此我读入“infile”的文件以逗号和换行符分开。我将这些变量存储到向量数组中,以便稍后进行排序和切换。在这一点上我很难过。
【问题讨论】:
在附加到years
之前添加另一个 getline(infile,line)
(这次没有分隔符)。然后这将读取该行的其余部分
不敢相信我竟然想到了这个!但是,当我尝试输入第二个“getline(infile,line)”时,我收到一条错误消息,说 getline 不能接受 int?除此之外,将我的年份向量更改为字符串会使代码正常。但是存储年份的字符串向量是没有意义的。不过非常感谢!
当你推入years
时,你必须明确地将 line 转换为 int
【参考方案1】:
一旦您将“,”作为分隔符,新行将被视为普通字符。所以使用getline()
而不指定分隔符(默认为新行)并尝试从您获得的字符串中提取名称和年份。使用find_first_of()
和substr()
可以很容易地做到这一点
例子:
while(getline(infile,str))
int index = str.find_first_of(',');
string name = str.substr(0,index);
string date = str.substr(index+1);
// Do something with name and date
【讨论】:
谢谢你!但是我试图理解子字符串的第二部分。当您说 (index + 1) 时,您是在说“逗号之后以及之后的任何内容”吗?在文本文件('\n')中看到新行后它是否也会停止读取? “str”一次只包含一行。所以第二行一直读到该行的末尾。是的,逗号后的任何内容都放入第二个字符串。 我明白了,谢谢。这对我很有帮助。因此,如果文本文件行是例如 Max, 1979 带有逗号和空格的名称,我会写: string date = str.substr(index+2);?【参考方案2】:当涉及到此类操作时,StringStream 的功能要强大得多。但是,在您的情况下(这被认为相当简单),您可以对字符串进行简单的操作。 我建议将每一行读入您的临时字符串,然后用逗号将其拆分并将值添加到您的向量中,如下所示:
void calcAges()
while (getline(infile, line)) // Read a whole line (until it reads a '\n', by default)
names.push_back(line.substr(0,line.find(",")); // Read from the beginning of the string to the comma, then push it into the vector
years.push_back(std::stoi(line.substr(line.find(",") + 1)); // Read from the comma to the end of the string, parse it into an integer, then push it into the vector
我假设您使用来自<string>
库的std::string
作为line
变量的类型。
顺便说一句,我没有编译和测试这个,所以我不确定它是否会按原样工作,但我写它只是为了让你了解逻辑方法
干杯
【讨论】:
这行得通,所以我想读取文件的最佳方法之一是逐行执行,然后从该行开始工作?通过对我的代码进行简单的操作,我可以明白你的意思。不过谢谢! 这确实取决于具体情况,但通常您将从磁盘读取文件,这意味着读取操作比您的其他代码慢得多。因此,为了使事情尽可能顺利,批量进行文件访问操作是一种代码优化实践。当然,我说的是除非您处理大量数据,否则甚至不会引起注意的优化,但我想一个好的做法总是好的。以上是关于将文件读入以逗号和换行符分隔的向量的主要内容,如果未能解决你的问题,请参考以下文章