使用c ++中的文本文件中的杂散空格读取逗号分隔值

时间:2014-08-17 21:09:31

标签: c++ file comma

我有一个包含多行的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;
    }
}

这似乎没有正确地读取值并首先在屏幕上显示。如何在这里读取字符串和整数值(可能有杂散的空格)并将它们存储到一个数组中(三个数组是精确的)?

3 个答案:

答案 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[^,]"之类的字符串更具可读性。

干杯〜