将逗号分隔文件读入整数数组

时间:2016-12-03 07:30:55

标签: c++ arrays file-io

我试图将包含整数的文本文件读入整数数组。 如果输入为:1 3 4 5 6 (中间有空格)工作正常。

但是如果输入是:1,3,4,5,6(以逗号分隔)。它只是打印1.(第一位)。如果程序发现1,3,4,5,6作为单个实体然后它应该打印 1,3,4,5,6作为第一个指数ryt? 还有File>> x,这个表达式通过检测其间的空间来逐个取值吗?

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main()
{    
    int n = 0; //n is the number of the integers in the file ==> 12
    int num;
    int arr[100];
    int x;
    int sum = 0;
    ifstream File;
    File.open("integer.txt");
    if(!File.is_open())
    {
        cout<<"It failed"<<endl;
        return 0;
    }

    while(File>>x)
    {
        arr[n] = x; 
        n++;
    }

    File.close();
    cout<<"n : "<<n<<endl;
    for(int i=0;i<n;i++)
    {
        cout << arr[i] << " ";
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

这里发生的是,在提取第一个字母后,您的代码会尝试将逗号提取为整数。因为它无法做到这一点,它将返回false并结束循环。

有一个非常相似的问题here

你的while循环应如下所示:

while(File>>x)
{
    arr[n] = x; 
    n++;
    if (ss.peek() == ',')
        ss.ignore();
}

答案 1 :(得分:0)

当你用逗号输入文件时,它最有可能是将它作为整个字符串读取。确保这也是逗号的分隔符,我不知道你将逗号放在这个代码中的哪个位置,但是你需要一个分隔符。

//example function you can use.
getline( ss, s, ',' )

答案 2 :(得分:0)

  

但如果输入为:1,3,4,5,6(逗号分隔)。它只是打印   1.(第一位数字)。如果程序找到1,3,4,5,6作为单个实体,那么它应该打印1,3,4,5,6作为第一个索引ryt?

它只打印“1”,因为您尝试将“1,3,4,5,6”读入function triggerClick(that) { $(that).tab('show').hide().show(0); // force a repaint console.log("show triggered " + " ", $(that)); } 个对象。但是,int不能是“1,3,4,5,6”。简单地说,一旦达到第一个“坏”字符,即逗号,解析就会停止,并且你最终得到到目前为止已建立的整数,即“1”。

其余输入被丢弃。这就好像你的行是“1abcdef”或“1abcdef2345”。

  

还有File&gt;&gt; x,这个表达式一个接一个地取值   检测之间的空间??

是的,这使得它非常不灵活。

我建议使用std::getline而不是摆弄int而不是摆弄operator>>作为分隔符。虽然函数的名称不再有意义,因为它不再读取(就像使用默认分隔符','一样),它可以正常工作。

您将最终使用'\n'个对象,这些对象可以使用std::stoi轻松转换为std::string

当你在它时,摆脱原始的int并使它成为int arr[100],这样你不仅限于100个元素。无论如何,100是一个丑陋的魔法(任意)数字。

以下是一个例子:

std::vector<int>

正如您所看到的,我还借此机会提出了一些其他优秀的C ++实践,例如避免#include <iostream> #include <sstream> #include <string> #include <vector> int main() { // faking some test file input; behaves like an `std::ifstream`: std::istringstream is("1,2,3,4,5"); std::vector<int> numbers; std::string number_as_string; while (std::getline(is, number_as_string, ',')) { numbers.push_back(std::stoi(number_as_string)); } std::cout << "n : " << numbers.size() << "\n"; for(auto&& number : numbers) { std::cout << number << "\n"; } } using namespace std

答案 3 :(得分:-1)

您是否尝试过使用ifstream的sscanf?下面是一个简单的例子

    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;

    int main()
    {
        int n = 0; //n is the number of the integers in the file ==> 12
        int num;
        int arr[100];
        char line[200];
        char *ptr=line;
        int x=0,count=0;
        int sum = 0;
        ifstream File;
        File.open("integer.txt");
        if(!File.is_open())
        {
            cout<<"It failed"<<endl;
            return 0;
        }
        File.getline(line,200);

       while((count=sscanf(ptr,"%d,",&x))>0)
        {
            arr[n] = x;
            n++;
            ptr+=count+1;
        }
        File.close();
        cout<<"n : "<<n<<endl;
        for(int i=0;i<n;i++)
        {
            cout << arr[i] << " ";
        }
        cout<<endl;
        return 0;
    }