| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1942 人关注过本帖
标题:请教个问题,读入txt文件中的特定行特定列数据,并保存到一个二维数组中去
只看楼主 加入收藏
wo严
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2015-8-20
收藏
得分:0 
回复 10楼 TonyDeng
对的对的,是51个,我需要的是数值,按规则将数值存到a[i][j]这个二维数组中就可以了
2015-08-27 14:53
wo严
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2015-8-20
收藏
得分:0 
回复 10楼 TonyDeng
对的对的,是51个点,我需要的是数据,将这些数据按规则保存到a[i][j]这个二维数组中去就可以了!
2015-08-27 14:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你是要这样的效果是吧?
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2015-08-27 15:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
/*

 * 我想读入附件中的数据,我想读入Y对应的数据,并将数据存入到a[i][j]中去,其中i表示第i个x,j表示第j个curve;

 * 例如对应的数据为a[0][0]=3.500000e+002,  a[1][0]=3.487281e+002直到把全部Y数据存入到a[i][j]这个50*341二维数组中!
*/

#pragma comment( compiler )

#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#include <conio.h>

const size_t PointsPerCurve = 51;

struct Point
{
    double Increment;            // X
    double Temperature;            // Y
};

struct Curve
{
    Point points[PointsPerCurve];
};

void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}

bool Load_Data(std::vector<Curve*>& curves, const char* fileName)
{
    FILE* inputFile;
    errno_t errorCode = fopen_s(&inputFile, fileName, "rt");
    if (errorCode != 0)
    {
        printf_s("数据源文件%s打开错误,错误码为%d,请在网上检索错误码对应的信息。\n", fileName, errorCode);
        Pause();
        return false;
    }

    char bufferLine[1024];
    while (fgets(bufferLine, _countof(bufferLine), inputFile) != NULL)
    {
        bool newCurve = false;
        if (strstr(bufferLine, "Curve") != NULL)
        {
            curves.push_back(new Curve);
        }
        if (strstr(bufferLine, "------------------------------") != NULL)
        {
            newCurve = true;
        }
        if (newCurve)
        {
            for (size_t index = 0; index < PointsPerCurve; ++index)
            {
                Point point;
                if (fscanf_s(inputFile, "%lf %lf\n", &point.Increment, &point.Temperature) == 2)
                {
                    curves.back()->points[index] = point;
                }
            }
            newCurve = false;
        }
    }

    fclose(inputFile);

    return true;
}

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        printf_s("请以数据源文件名为参数启动程序\n");
        Pause();
        return EXIT_SUCCESS;
    }

    std::vector<Curve*> curves;        // 容器内的元素是指针,每个指针指向从堆分配的1个Curve数据
    if (Load_Data(curves, argv[1]))
    {
        // 在堆空间中构造所需要的数组,用完后自己释放
        double* arrTemperatures = new double[PointsPerCurve * curves.size()];
        size_t curveIndex = 0;
        for (const Curve* curve : curves)
        {
            for (size_t index = 0; index < PointsPerCurve; ++index)
            {
                // 注意一维数组当二维的下标用法
                arrTemperatures[index * curves.size() + curveIndex] = curve->points[index].Temperature;
            }
            ++curveIndex;
            delete curve;
        }

        // 输出数据到文件中以便验证正确性
        FILE* outputFile;
        fopen_s(&outputFile, "opt_out.txt", "wt");
        double* p = arrTemperatures;
        for (size_t i = 0; i < PointsPerCurve; ++i)
        {
            for (size_t j = 0; j < curveIndex; ++j)
            {
                fprintf_s(outputFile, "%e ", *p++);
            }
            fputc('\n', outputFile);
        }
        fclose(outputFile);
    }
    
    return EXIT_SUCCESS;
}

授人以渔,不授人以鱼。
2015-08-27 15:10
wo严
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2015-8-20
收藏
得分:0 
回复 14楼 TonyDeng
哇,太牛了,谢谢版主,感激不尽
2015-08-27 15:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
解释一下我为什么把你要求的二维数组改成一维:

C语言本身就没有二维及以上的数组概念,它只有数组的数组,比如你定义a[i][j],那其实是i个元素,而其中的每个元素又是j个元素,所以这跟我们数学观念上的二维数组是不同的。但你需要的正是一个二维点阵数据,每个点是独立的,祗不过按行列分布而已,所以,在计算机处理上,完全可以祗用一维数组存储。这种数组的用法,是逻辑上每341个数据为一行,要存取下一行的数据,只要用行号(row)乘以行长(341)再加列号(col)即可。这个做法,省去了动态分配二维数组空间的复杂指针代码,简化内存管理。

但实际上,如果你看懂了我的代码,就知道,根本就不需要做这种过渡的,原先的vector容器就已经满足需要了。

授人以渔,不授人以鱼。
2015-08-27 15:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这个程序的麻烦,是图(Curve)的数目不确定,但却是二维数组的列,反而行是固定的,所以直接分配数组是比较困难的。动态行好调整,动态列不好调整。

授人以渔,不授人以鱼。
2015-08-27 15:28
wo严
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2015-8-20
收藏
得分:0 
回复 17楼 TonyDeng
我正在看这些程序,努力先搞明白,通过您的讲解更明白点了!
2015-08-27 15:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
本来想做51也不定的,不单是不确定51,还不确定每幅图有多少个点,但后来看到你的数据全是51的,就偷懒了。不过现在把51设为常数,你自己随时可以改,后面的代码不用变。

授人以渔,不授人以鱼。
2015-08-27 15:56
wo严
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2015-8-20
收藏
得分:0 
回复 19楼 TonyDeng
我这里51和341都是确定的,因为这是一个分析软件,设定的就是51和341,所以得到的结果里面这两个数不变的
2015-08-27 16:11
快速回复:请教个问题,读入txt文件中的特定行特定列数据,并保存到一个二维数组 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018211 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved