我有一个包含多行的string,int,int值的文件。
Delhi,12,13
Mumbai,100 , 101
Kolkata,11, 12
这些值用逗号分隔,但两者之间可能有杂散的空格。我现在的代码就是这样:
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main()
{
FILE *f = fopen("input.txt","r");
int lines = 0;
char c = getc(f);
while(c != EOF)
{
if(c == '\n')
{
lines++;
}
c = getc(f);
}
lines++;
string arr[lines];
int t1[lines];
int t2[lines];
char s1[100],s2[100],s3[100];
int x,y;
fclose(f);
f = fopen("input.txt","r");
while (fscanf(f,"%99[^,],%99[^,],%99[^,]", s1, s1, s2)==3)
{
cout << s1 << s2 << s3 << endl;
}
}
这似乎没有正确地读取值并首先在屏幕上显示。如何在这里读取字符串和整数值(可能有杂散的空格)并将它们存储到一个数组中(三个数组是精确的)?
答案 0 :(得分:2)
问题在于这一行:
while (fscanf(f,"%99[^,],%99[^,],%99[^,]", s1, s1, s2)==3)
它会尝试扫描下一行的下一个逗号字符','
。替换为%99[^\n]
以解决此问题:
while (fscanf(f,"%99[^,],%99[^,],%99[^\n]", s1, s1, s2)==3)
答案 1 :(得分:2)
尝试这样做:
fscanf(f,"%[^, ]%*[ ,]%d%*[ ,]%d ", s1, &x, &y);
%[^, ]
=&gt;搜索除,
和<space>
之外的所有内容,并将其存储在s1
%*[ ,]
=&gt;搜索,
和<space>
,但不会将其存储在任何位置(*
确保){/ p>
%d
=&gt;存储号码
答案 2 :(得分:1)
为什么在C ++中使用FILE*
和朋友?
其他答案指明代码的问题,所以我写这个答案是为了告诉你如何改进它。
std::ifstream file("input.txt");
std::string name, value0, value1;
while (std::getline(file, name, ',')) {
// Get the value strings from the stream.
std::getline(file, value0, ',');
std::getline(file, value1, ',');
// These will throw an exception when given invalid input.
int v0 = std::stoi(value0);
int v1 = std::stoi(value1);
// Do stuff with the strings
}
std::getline
可用于从流中提取字符串直到某个分隔符。这里忽略了空格,所以我们不必关心它们。 std::getline
的返回值是传入的流,它有一个operator bool()
,允许我们将它用作布尔表达式。当流为空或处于某种错误状态时,该值将变为false
。
请注意,上述内容应与以下内容类似:
while (file) {
std::getline(file, name, ',');
// ...
}
我很确定这比"%99[^,],%99[^,],%99[^,]"
之类的字符串更具可读性。
干杯〜