1

我在 Windows 7 上使用 Code::Blocks 从 .cpp 文件制作小 .exe,我是初学者(对不起!)

这是今天的问题:

我有一个 .csv 文件,其中包含用分号分隔的长整数(从 0 到 2^16)并列为一系列水平线。

我将在这里做一个简单的例子,但实际上文件可以达到 2Go 大。

假设我的文件 wall.csv在文本编辑器中如下所示Notepad++

350;3240;2292;33364;3206;266;290

362;314;244;2726;24342;2362;310

392;326;248;2546;2438;228;314

378;334;274;2842;308;3232;356

奇怪的是,它在windows中看起来像这样notepad

350;3240;2292;33364;3206;266;290
362;314;244;2726;24342;2362;310
392;326;248;2546;2438;228;314
378;334;274;2842;308;3232;356

反正,

假设我将知道并将在 3 个float变量中声明列数、行数和文件中的值。

int col = 7;   // amount of columns
int lines = 4; // amount of lines
float x = 0;     // a variable that will contain a value from the file  

我想:

  1. 创建一个vector <float> myValues
  2. 处理 csv 第一行中的每个myValues.push_back(x)
  3. 处理csv第二行中的每个myValues.push_back(x)
  4. 处理第 3 行中myValues.push_back(x)的每个值...等。

直到文件完全存储在向量 myValues 中。

我的问题:

我不知道如何将xcsv 文件中存在的值连续分配给变量。

我该怎么做?


好的,这段代码可以工作(相当缓慢但可以!):

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

int col = 1221;   // amount of columns
int lines = 914; // amount of lines
int x = 0;     // a variable that will contain a value from the file

vector <int> myValues;

int main() {

    ifstream ifs ("walls.tif.csv");

    char dummy;
    for (int i = 0; i < lines; ++i){
        for (int i = 0; i < col; ++i){
            ifs >> x;
            myValues.push_back(x);
            // So the dummy won't eat digits
            if (i < (col - 1))
                ifs >> dummy;
        }
    }
    float A = 0;
    float B = col*lines;

    for (size_t i = 0; i < myValues.size(); ++i){

        float C = 100*(A/B);
        A++;
        // display progress and successive x values
        cout << C << "% accomplished, pix = " << myValues[i] <<endl;
    }
}
4

2 回答 2

3

将文本数据放入 astringstream并使用std::getline.

它需要一个可选的第三个参数,即"end-of-line"字符,但您可以使用它;来代替真实的end of line.

称呼 while (std::getline(ss, str, ';')) {..}

每个循环都将文本放入std::string.

然后,您需要转换为数字数据类型并推入向量,但这会让您开始。

另外,为什么要使用floats列数和行数?

它们是整数值。

于 2013-07-16T16:05:34.873 回答
2

尝试使用 C++ 标准模板库的输入操作。

制作一个虚拟字符变量来吃掉分号,然后将 cin 数字放入您的 x 变量中,如下所示:

char dummy;
for (int i = 0; i < lines; ++i){
    for (int i = 0; i < col; ++i){
        cin >> x;
        myValues.push_back(x);
        // So the dummy won't eat digits
        if (i < (col - 1))
            cin >> dummy;
    }
}

为此,您可以将 csv 文件重定向为从命令行输入,如下所示:

yourExecutable.exe < yourFile.csv

要遍历一个充满数据的向量:

for (size_t i = 0; i < myVector.size(); ++i){
    cout << myVector[i];
}

上面,size_t 类型由 STL 库定义,用于抑制错误。

如果您只想使用这些值一次,并在使用时将它们从容器中删除,那么最好使用 std::queue 容器。这样,您可以使用 front() 查看前面的元素,然后使用 pop() 将其删除。

于 2013-07-16T16:05:39.957 回答