【发布时间】:2018-04-08 18:12:06
【问题描述】:
我在这个问题上看到了其他答案,但他们都处理std::stringstream,或临时char 或std::string 数组,各种其他类型的外部库,但我想尝试只使用fstream 标头,尝试读取只有数字的文件,char 和 short,连同 float,用逗号分隔,形成多行文本;有些可能是数组或向量。示例:
1,1.1,11.1,11
2,2.2,22.2,22
3,3.3,33.3,33
...
顺序是已知的,因为每一行都遵循来自struct 的变量。行数可能会有所不同,但现在,我们假设它也是已知的。同样为了举例,我们只考虑这个顺序和这些类型:
int, double, double, int
结合我看过的一段代码,我尝试了这种简单化(而且很可能是幼稚)的方法:
int a, d;
double b, c;
char fileName {"file.txt"};
std::fstream fs {fileName};
if(!fs.is_open())
// open with fs.out, write some defaults; this works, no need to mention
else
{
char comma;
while(fs.getline(fileName, 100, '\n'))
{
fs >> a >> comma >> b >> comma >> c >> comma >> d;
std::cout << 2*a << ", " << 2*b << ", " << 2*c << ", " << 2*d << '\n';
}
}
如果文件有上面的三行,加上一个结尾的\n,它会输出:
4, 4.4, 44.4, 44
6, 6.6, 66.6, 66
6, 6.6, 66.6, 66
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
如果我在文件开头添加\n,它会输出:
2, 2.2, 22.2, 22
4, 4.4, 44.4, 44
6, 6.6, 66.6, 66
6, 6.6, 66.6, 66
如果我删除最后一个\n,它会按预期工作。我有几个问题:
在编写文件时,除了添加开头
\n并且不插入终止文件以按预期工作之外,我还能做什么?如果变量的数量更长,比如每行 100 个,我该怎么做才能避免使用
fs >> a >> c >> ...绕地球一圈?如果我只需要读取特定行或仅几行,则一种方法可能是以某种方式计算
\n或行的出现次数。我怎么能这样做?
(编辑)
- 最后,正如标题所提到的,是否可以在不涉及其他标头的情况下仅使用
fstream(例如目前的情况)来做到这一点?
【问题讨论】:
-
您可能想再次检查您的代码。这真的没有意义。
-
@FeiXiang 谢谢你让我知道。我看到我在
fs >> ...行中颠倒了两个<<。还有什么我想念的吗? (不要编辑太多次) -
有一些帖子改变了语言环境。搜索它
-
解析csv文件c++。使用该搜索字符串,您应该会偶然发现具有 csv_classification 结构的答案。
-
您试图提取一行并将其放入名为
fileName的字符数组中,基本上丢弃一行,因为您从未读取过fileName。