| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 556 人关注过本帖
标题:关于读取 txt 文件的问题
只看楼主 加入收藏
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:1 
关于读取 txt 文件的问题
程序的目的是:说明一下,这和光谱学没有多少关系,完全属于C的读取文件的操作。读取一个文件夹里的所有光谱数据的txt文件,并读出每一个txt里面的数据存入自己创建的二位动态数组q_arr[N2][M],N2表示光谱的谱图数,即一共有几张光谱,M表示每个谱图里的波长范围,谱图的特征数据存放在一个结构体中。程序如下:

#include<malloc.h>
#include<stdlib.h>
#include <stdio.h>
#include <io.h>
#include<string.h>
#include<math.h>

const char * to_search="E:\\Documents\\Desktop\\微型光谱仪\\光谱数据\\*.txt";   //欲查找的文件,支持通配符
const int N1=3; //光谱的wavelength,S,T共三个量
const int M=20;//特征波长范围
const int N2=3;//光谱谱图的数量

typedef struct str_data_1        //光谱仪得到的初始数据(第一级数据)
{
    int wavelength;    //wavelebgth表示波长
    float S;    //S表示能量计数值
    float T;    //T表示透射率
}STR_D_1,* p_STR_D_1;
int main(void)
{
     int i;
     p_STR_D_1 p[M];
     for(i=0;i<M;i++)
     {
         p[i]=(p_STR_D_1)malloc(sizeof(STR_D_1)*M);
         if(NULL==p[i])
         {
             printf("p[%d]内存分配失败!程序终止!\n",i);
             exit(-1);
         }
     }
     p_STR_D_1 * q_arr=&p[0];    //创建二维动态结构体数组q_arr[N2][M],即q_arr[3][20]
     long handle;                                    //用于查找的句柄
     struct _finddata_t fileinfo;             //文件信息的结构体
     handle=_findfirst(to_search,&fileinfo);         //第一次查找
     if(-1==handle)
     {
         printf("未查找到txt文件!\n");
         exit(-1);
     }
     printf("%s\n",fileinfo.name);            //打印出找到的文件的文件名
     i=0;
     spectrum_data(fileinfo.name,q_arr,i);
     i++;
     while(!_findnext(handle,&fileinfo))             //循环查找其他符合的文件,直到找不到其他的为止
     {
          printf("%s\n",fileinfo.name);
          spectrum_data(fileinfo.name,q_arr,i);
          i++;
     }
     _findclose(handle);                           //关闭句柄
     system("pause");
     /*standard_data(p_str1_data);            //数据矩阵标准化处理
     simcoe_matrix(p_str1_data);*/
     return 0;
}
void spectrum_data(char * filename,p_STR_D_1 * q_arr,int i)    //读取光谱数据函数
{
    int j=0;
    int wave;
    float s_count,tr;
    char s[20];
    FILE * fp=NULL;                            //文件指针
    char file_road[100]={"E:\\Documents\\Desktop\\微型光谱仪\\光谱数据\\"};    //数据所在文件夹,
                                        //注:char * file_road="E:\\..."    会运行不了!
    strcat(file_road,filename);                //具体txt文件路径        
    printf("%s\n",file_road);
    fp=fopen(file_road,"r");
    if(NULL==fp)
    {
        printf("打开文件失败!\n");
        exit(-1);
    }
    fgets(s,99,fp);
    printf("%s\n",s);
    printf("strlen(s)=%d\n",strlen(s));
    fseek(fp,strlen(s),0);//把fp指针移动到离文件开头strlen(s)字节处;
    while(!feof(fp))
    {
        fscanf(fp,"%d %f %f",&wave,&s_count,&tr);
        printf("%d %.3f %.3f\n",wave,s_count,tr);
        if(wave>=560 && wave<=580)    //逐行扫描直至波长为560开始,连续存储560-580的光谱数据特征值
        {
            q_arr[i][j].wavelength = wave;
            q_arr[i][j].S = s_count;
            q_arr[i][j].T  = tr;
            j++;
        }
        if(wave>580)    //波长大于580后结束扫描过程
            break;
    }
    fclose(fp);
    printf("截取560-580波长后的数据输出如下:\n");
    for(j=0;j<M;j++)
    {
        printf("%d  %.3f  %.3f\n",q_arr[i][j].wavelength,q_arr[i][j].S,q_arr[i][j].T);
    }
    return;
}

第一个谱图的数据能正确读出,但是第二个谱图的数据读出一堆垃圾值,个人认为可能是对_findnext(handle,&fileinfo)的理解有问题,但是在网上也未能搜索到关于这个函数的详细解释。希望有哪位仁兄能给出原因,感激不尽!
程序运行结果如下所示:

谱图1.txt
E:\Documents\Desktop\微型光谱仪\光谱数据\谱图1.txt
波长    S(谱图2)        RT(谱图2)

strlen(s)=24
500 535.373 0.212
501 543.499 0.153
502 556.300 0.308
503 570.035 0.322
504 569.681 0.218
505 579.207 0.205
506 573.040 0.285
507 595.956 0.418
508 577.770 0.334
509 577.638 0.370
510 595.119 0.399
511 618.712 0.449
512 606.469 0.497
513 588.083 0.372
514 575.466 0.348
515 576.309 0.373
516 609.846 0.418
517 620.643 0.486
518 635.379 0.499
519 628.305 0.427
520 633.929 0.496
521 645.663 0.577
522 655.983 0.578
523 648.676 0.530
524 640.490 0.496
525 653.569 0.486
526 664.490 0.515
527 669.148 0.477
528 669.983 0.524
529 683.113 0.570
530 685.986 0.540
531 715.229 0.655
532 738.656 0.680
533 770.885 0.698
534 783.921 0.728
535 766.350 0.697
536 838.193 0.748
537 869.741 0.715
538 803.512 0.730
539 811.679 0.822
540 812.141 0.823
541 879.620 0.893
542 914.697 0.888
543 906.548 0.959
544 918.263 1.026
545 909.683 1.046
546 935.434 1.168
547 1009.230 1.258
548 1039.202 1.282
549 1057.462 1.354
550 1077.229 1.409
551 1140.260 1.562
552 1218.785 1.636
553 1245.351 1.695
554 1257.094 1.770
555 1328.747 1.917
556 1391.701 2.088
557 1433.828 2.193
558 1453.936 2.254
559 1496.429 2.298
560 1546.680 2.413
561 1571.565 2.481
562 1636.592 2.604
563 1713.132 2.729
564 1767.911 2.861
565 1861.831 2.988
566 1911.171 3.095
567 1933.390 3.187
568 2016.294 3.396
569 2076.519 3.570
570 2109.954 3.703
571 2173.340 3.801
572 2257.296 3.940
573 2312.002 4.094
574 2362.790 4.221
575 2460.675 4.439
576 2520.153 4.550
577 2572.408 4.642
578 2618.630 4.812
579 2629.886 4.832
580 2671.815 4.898
581 2747.573 5.072
截取560-580波长后的数据输出如下:
560  1546.680  2.413
561  1571.565  2.481
562  1636.592  2.604
563  1713.132  2.729
564  1767.911  2.861
565  1861.831  2.988
566  1911.171  3.095
567  1933.390  3.187
568  2016.294  3.396
569  2076.519  3.570
570  2109.954  3.703
571  2173.340  3.801
572  2257.296  3.940
573  2312.002  4.094
574  2362.790  4.221
575  2460.675  4.439
576  2520.153  4.550
577  2572.408  4.642
578  2618.630  4.812
579  2629.886  4.832
谱图2.txt
E:\Documents\Desktop\微型光谱仪\光谱数据\谱图2.txt       //问题出在这,第一个谱图可以正确读出所需数据,但是第二个谱图读出错误
搜索更多相关主题的帖子: Documents Desktop include 光谱仪 文件夹 
2014-04-28 12:01
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:14 
这东西还是你自己调试吧  很很很努力的调试  会成功的

DO IT YOURSELF !
2014-04-29 09:35
快速回复:关于读取 txt 文件的问题
数据加载中...
 
   



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

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