[读取][EDIT]请问如何读取多行EDIT里的换行符

09月 13th, 2008 by admin
Posted in VC/MFC | No Comments »

要一行一行的读,为什么用GetLine读到的字符串里原来的换行符没有了。

有些操作一次读完不好弄

那你每次读取一行,然后自己增加回车换行.

不是换行的问题,我知道插入换行,问题是我怎么读出来

引用 4 楼 guetcw 的回复:
不是换行的问题,我知道插入换行,问题是我怎么读出来

GetLine就是读取一行的意思,会自动将尾部的换行符替换成结束符''的
就像C里面的gets一样,是不会读入换行的

你既然知道有换行符,还用读出来吗?读出来的结果加'
'不就是了嘛

我都说了不是要换行了,如果你要判断是软换行还是硬换行,你就知道我的意思了

关联CString变量或用GetWindowsText()

不明白楼上的关联CString变量是什么意思

Tags: , ,

[注册表][读取][RegQueryValueEx.]关于注册表键值的读取 RegQueryValueEx.请教

09月 12th, 2008 by admin
Posted in VC/MFC | No Comments »

        CString path = L"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\";
path += dot2type;
::RegOpenKeyEx(HKEY_CURRENT_USER, path,0, KEY_ALL_ACCESS, &hKEY);

DWORD  dwType = REG_SZ;
LPBYTE  lpbValue =  new BYTE[MAX_PATH];
DWORD  size = MAX_PATH;     
long ret2 = ::RegQueryValueEx(hKEY, L"Application", NULL, &dwType, lpbValue, &size); 
CString str_name = CString(lpbValue);
delete[] lpbValue;

strCommandValue = L"ImageBrowser.exe";
::RegSetValueEx(hKEY, L"Application",NULL, REG_SZ,(const BYTE*)(LPCTSTR)strCommandValue,(strCommandValue.GetLength()+1)*sizeof(TCHAR));

::RegCloseKey(hKEY);

上面的代码是,我想先打开一个键,然后想用RegQueryValueEx读取他Application的值,并保存起来,之后通过RegSetValueEx修改该键的值为ImageBrowser.exe";
打开修改都可以, 但是,我想读取却总是得不到正确的结果,lpbValue值竟然是一个“I”
另外RegQueryValueEx返回值是0.请问高手问题出在那ne ?

lpbValue值竟然是一个“I”

你在哪里看到的?

MessageBox( CString(lpbValue) );

这样显示应该是没问题的。

只显示一个“I”是不是在调试窗口中看到的?在调试窗口中查看CSTRING类型的数据的话,好像只显示第一个字符吧。。。

UNICODE 数据在 多字符集 中显示的话,就会出现这个问题,因为ASCII后边紧跟一个0

引用 2 楼 zaodt 的回复:

lpbValue值竟然是一个“I”

你在哪里看到的?

MessageBox( CString(lpbValue) );

这样显示应该是没问题的。

我这样做了。还是显示“I”

  没有什么问题呀 返回0说明成功调用

lpvalue 不是被你delete掉了嘛

delete后最好置为NULL

DWORD  dwType = REG_SZ;
TCHAR  szAppValue[_MAX_PATH]; 
DWORD  dwSize = sizeof(szAppValue); 
long ret2 = ::RegQueryValueEx(hKEY, L"Application", NULL, &dwType, (LPBYTE)szAppValue, &dwSize);

我这样做 可以得到正确的值、

Tags: , , ,

[geotiff][读取][信息]geotiff 读取信息不全问题

09月 10th, 2008 by admin
Posted in VC/MFC | No Comments »

1 254 1 4 0 新的子文件类型(NewsubfileType)
2 256 1 3 5000 图像宽度(ImageWidth)
3 257 1 3 5000 图像长度(ImageLength)
4 258 3 3 75073530 每个像素点位数(BitsPerSample)
5 259 1 3 1 压缩(Compression)
6 262 1 3 2 测光度翻译(PhotometricInterpretation)
7 273 5000 4 75073536 条的偏移量(StripOffsets)
8 277 1 3 3 每个像素的样点数(SamplePerPixel)
9 278 1 3 1 每个条的行数(RowsPerStrip)
10 279 5000 4 75093536 条中字节计数(StripByteCounts)
11 282 1 5 75113536 X分辨率(XResolution)
12 283 1 5 75113544 Y分辨率(YResolution)
13 284 1 3 1 平面配置(PlanarConfiguration)
14 296 1 3 2 分辨率单位(ResoulutionUnit)
15 305 27 2 75113552 软件(Software)
16 306 20 2 75113580 日期时间(DataTime)
17 -31986(33550) 3 12 75113600 像元比例标签(ModelPixelScaleTag)
18 -31813(33723) 2 4 75113624
19 -31614(33922) 6 12 75113632 控制点标签(ModelTiepointTag)
20 -31159(34377) 12936 1 75113680
21 -30871(34665) 1 4 75019364
22 -30801(34735) 28 3 75126616 地理信息目录表
23 -30799(34757) 413 2 75126672

上表的表头:
序号 Tag length type valueOffset 标签说明

Tags: , , ,

[.ini][文件][读取]如何将从.ini文件中读取的内容写入注册表

09月 6th, 2008 by admin
Posted in VC/MFC | No Comments »

问题同上
注册表中没有相关键

1、读ini
2、写注册表

读INI已经完成了 、总共读入了四行数据
但是注册表中没有相关键(包括主键)
建立主键怎么怎么弄?
RegCreateKey OR RegCreateKeyEx

Registry Functions
The following functions are used with the registry: 

RegCloseKey 
RegConnectRegistry 
RegCreateKey 
RegCreateKeyEx 
RegDeleteKey 
RegDeleteValue 
RegEnumKey 
RegEnumKeyEx 
RegEnumValue 
RegFlushKey 
RegGetKeySecurity 
RegLoadKey 
RegNotifyChangeKeyValue 
RegOpenKey 
RegOpenKeyEx 
RegQueryInfoKey 
RegQueryMultipleValues 
RegQueryValue 
RegQueryValueEx 
RegReplaceKey 
RegRestoreKey 
RegSaveKey 
RegSetKeySecurity 
RegSetValue 
RegSetValueEx 
RegUnLoadKey

。。。。不用那么多啊~~~
我想问的是怎么建立一个主键
就是图标像文件夹那种
用哪个函数

搜集一下函数

创建用RegCloseKey

你也可以用CRegKey这个类

RegCloseKey
这不是关闭么

Tags: , , ,

[语言][读取][数据]请教高手:C语言读取数据问题

08月 30th, 2008 by admin
Posted in VC/MFC | No Comments »

我的问题主要是发现有段代码编译器好像根本就没运行。是
for(j=0;j <120;j++)
  { m=(int)data[j].FMJE;

到最后。我主要是想在数组FMJA中寻找最小值,但同时还要与FMJA同行的FMJE值不为零。我弄了好久了,一直找不到问题所在,请教达人啊!
下面是完整代码:

#include <stdlib.h>
#include <stdio.h>
#include "math.h"
#include "fstream.h"
#include "string.h"
#define SIZE 120
struct data_type //储存读入值
{  float    FMJA ;
  float FMJB ;
  float FMJC;
  float FMJD;
  float FMJE;
}data[SIZE];
void main(){
float zuixiao,temp;
int i,m,n,j;
FILE *fp;
fp=fopen("data.sv","r");
for(i=0;i <SIZE;i++)
{    if(fscanf(fp,"%f %f %f %f %f
",&data[i].FMJA,&data[i].FMJB,&data[i].FMJC,&data[i].FMJD,&data[i].FMJE))
      {        printf("读取数据文件:%d行数据正确读入
%f %f %f %f %f
",i+1,data[i].FMJA,data[i].FMJB,data[i].FMJC,data[i].FMJD,data[i].FMJE );
      }
else{          printf("数据第%d行读入错误,请确认数据储存格式正确
",i+1 ) ;}
}
zuixiao=data[0].FMJA;
for(j=0;j <120;j++)
  { m=(int)data[j].FMJE;
    while(m!=0)
    {if(data[j].FMJA <data[j+1].FMJA)
        temp=data[j].FMJA ;
      else
        temp=data[j+1].FMJA ;
    }
      if(temp <zuixiao )
      zuixiao=zuixiao;
      else
      zuixiao=temp;
  }
cout < <"较大数是:" < <data[0].FMJA < <" " < <"较小数是:" < <zuixiao;
printf("提取数据2:%f %f %d
",data[0].FMJA,zuixiao,m) ;
}

下面是部分数据段:

21.40  .0516  .0892    .0376    5319.
21.20  .0524  .0864    .0340    5882.
21.00  .0536  .0844    .0308    6494.
20.80  .0572  .0900    .0328    6098.
20.60  .0672  .1012    .0340    5882.
20.40  .0660  .1036    .0376    5319.
20.20  .0556  .1028    .0472    4237.
20.00  .0588  .0936    .0348    5747.
0.000  .0000  .0000    .0000    0.000

非常感谢!!!

Tags: , , ,

[读取][YUV时]读取YUV时出现问题请高手帮忙

08月 28th, 2008 by admin
Posted in VC/MFC | No Comments »

void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset);
unsigned char Y_space[Y_WIDTH*Y_HEIGHT];
unsigned char U_space[U_WIDTH*U_HEIGHT];
unsigned char V_space[V_WIDTH*V_HEIGHT];
main()
{int i=0;
long origin;
FILE *f=fopen("G:\Y","wb");
for(i=0,origin=0;i <148;i++,origin+=(Y_WIDTH*Y_HEIGHT+U_WIDTH*U_HEIGHT+V_WIDTH*V_HEIGHT))
{
  ReadImage(Y_space,"G:\hall_qcif.yuv",Y_WIDTH,Y_HEIGHT,origin);
  fprintf(f,"%
",Y_space);
  ReadImage(U_space,"G:\hall_qcif.yuv",U_WIDTH,U_HEIGHT,Y_WIDTH*Y_HEIGHT);
  ReadImage(V_space,"G:\hall_qcif.yuv",V_WIDTH,V_HEIGHT,Y_WIDTH*Y_HEIGHT+U_WIDTH*U_HEIGHT);
}
  while ( 1 );

}

void ReadImage(unsigned char *pImage,char *cFileName,int nWidth,int nHeight,long offset)
{
int j,i;
unsigned char *pWork;
FILE *fp=0;
if ( fp=fopen(cFileName,"rb" ) )  //打开一幅图像
{
  fseek(fp,offset,SEEK_SET);  //文件定位
  pWork=pImage; //指针指向
  for ( j=0;j <nHeight;j++,pWork+=nWidth )
  for ( i=0;i <nWidth;i++ )
    fread(pWork+i,1,1,fp); //顺序读取
  fclose(fp);
}
}
编辑运行都没问题,但是我想把每一帧的像素点Y的值存入文件Y中,但运行后Y文件是空的,没有任何值,不知道问题在哪里,请指教

怎么没人回呢

fprintf(f,"%
",Y_space);
这句话有问题吧,你试试
fprintf(f,"%s
",Y_space);

Tags: , ,

[请求][指教][读取]请求指教读取文件

08月 23rd, 2008 by admin
Posted in VC/MFC | No Comments »

问题描述:我要从一文件中读取数据(数据内容格式如下),将读取的数据放到数组中以便调用,我写了一个程序,编辑没有错,但是不能达到正确的结果,比如m_WellName中的数据没有读取第一列的数据,希望得到各位的指教,谢谢!
NW= 1
X8-13 1-Nov-75 5 5.3 17 5.5 0 147.8 1 106.9
X8-13 1-Dec-75 5 5 15 0.8 0 135.5 1 63.8
X8-13 1-Jan-76 10 7.7 10 1.9 0 188.5 1 1
X8-13 1-Feb-76 9 6.5 10 1.9 0 152.9 1 1
X8-13 1-Mar-76 6 5.9 13 1.8 0 135.7 1 1

X8-15 1-Nov-75 5 5.3 17 5.5 0 147.8 1 106.9
X8-15 1-Dec-75 5 5 15 0.8 0 135.5 1 63.8
/

程序:
  void CRead::Read_File()
{
CFileDialog dlg(TRUE,"txt","*.txt",OFN_HIDEREADONLY &brvbar OFN_OVERWRITEPROMPT,"Text Files(*.txt) &brvbar*.txt &brvbarAll Files(*.*) &brvbar*.* &brvbar &brvbar");
if(dlg.DoModal()==IDOK)
{
CString strFilePath=dlg.GetPathName();
char* pFilePath=(LPSTR)(LPCTSTR)strFilePath;
CStdioFile fp;
fp.Open(strFilePath,CFile::modeRead &brvbar CFile::typeText);
if(fp==NULL)
return;

m_WellName.RemoveAll();
m_WellTime.RemoveAll();
    m_WellWOPRH.RemoveAll();
        m_WellWOPR.RemoveAll();
    m_WellWWPRH.RemoveAll();
    m_WellWWPR.RemoveAll();
    m_WellWGPRH.RemoveAll();
m_WellWGPR.RemoveAll();
m_WellBHPH.RemoveAll();
m_WellBHP.RemoveAll();
m_WellNo.RemoveAll();

CString str="";
CString str1="";
CString str_Name="";
CString Time_str="";
int No;
int m_WellNumber;  //记录井数
m_WellNumber=0;

    double WOPRH_Value,WOPR_Value;
double WWPRH_Value,WWPR_Value;
double WGPRH_Value,WGPR_Value;
double BHPH_Value,BHP_Value;

while(fp.ReadString(str))
{

str1=str.Left(3);
str1.Format("%s",str1);

//str_Name="";
//Time_str="";
if(str1=="/")
break;
else if(str1=="NW=")
{
m_WellNo.Add(No);
m_WellNumber++;
}
else if(str1!="  ")
{
sscanf(str,"%s%s%l%l%l%l%l%l%l%l",str_Name,Time_str,WOPRH_Value,WOPR_Value,
WWPRH_Value,WWPR_Value,WGPRH_Value,WGPR_Value,BHPH_Value,BHP_Value);
m_WellName.Add(str_Name);
        m_WellTime.Add(Time_str);
            m_WellWOPRH.Add(WOPRH_Value);
m_WellWOPR.Add(WOPR_Value);
m_WellWWPRH.Add(WWPRH_Value);
m_WellWWPR.Add(WWPR_Value);
m_WellWGPRH.Add(WGPRH_Value);
m_WellWGPR.Add(WGPR_Value);
m_WellBHPH.Add(BHPH_Value);
m_WellBHP.Add(BHP_Value);
}
}
fp.Close();
}
}

加断点,一步一步看变量窗口中变量的值是不是正确的,最好。

问题出在
sscanf(str,"%s%s%l%l%l%l%l%l%l%l",str_Name,Time_str,WOPRH_Value,WOPR_Value,
      WWPRH_Value,WWPR_Value,WGPRH_Value,WGPR_Value,BHPH_Value,BHP_Value);
这一句。
sscanf中用的是LPTSTR类型的参数,你不能用CString类型强制转换。因为虽然不报错,但结果是不确定的。
你必须这样定义str_Name, 和 Time_str:
char str_Name[256];
char Time_str[256];

然后将它们赋值给CString类型
或者你在sscanf之前用str_Name.GetBufferSetLength(…)分配缓存,再调用sscanf.

谢谢各位的解答,希望以后能得到你们更多的指导。

Tags: , , ,

[读取][excel][数据]vc 读取excel数据并调用计算逆矩阵函数

08月 21st, 2008 by admin
Posted in VC/MFC | No Comments »

primer_programer 大哥,你的方差函数我已经成功了。 可以再帮小弟一个忙吗?

  先读取excel 里的一组数据,再用 Minverse 函数 计算逆矩阵。

我希望读取的数据可以保存到任意一个自己定义的动态数组,还有,读取excel一围数组和二围方法有什么不同?

如果你得到了正确的结果,也请告诉我修改的方法。

大虾, 我的调试技巧都只能在c++环境下发挥,vc下我无能为力啊。 可以给个c++下的的完整程序吗? 我如果成功,一定给告诉你结果,分照给。

最重要的是, 计算出来的逆矩阵是个3 行3 列的矩阵
0.25 0.25 -0.75
0 0 0.5
0.75 -0.25 -0.25

你的varRet 应该是存储这个矩阵的吧,怎么把这个数组里的数据转存到别的普通数组,或者读出来呢? 我现在都看不到里面的值。

读是一个逆过程,你看一下这篇文章:
http://blog.csdn.net/primer_programer/archive/2008/08/07/2781837.aspx
我知道这个逆矩阵是什么,但我在调试的时候把逆矩阵读出来了,是错误的。

等我再看看,对了再告诉你。

  你可以先告诉我,用什么方法读出来吗? 让我也好一起调试.
我希望可以把数据保存到一个普通的数组里.可以随便输入出来

hello eifujbv, 调试了一晚上,结果出来了。

// 定义测试数组
int arg2[3][3] = {1, 2, 1,
      3, 4, -1,
      0, 2, 0};
// 计算(这个方法没变)
VARIANT varArg1;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0; // 该维的下界
rgsabound[0].cElements = 3; // 该维的元素个数
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 3;
long lIndex[2];
psa = SafeArrayCreate(VT_I4, 2, rgsabound); // 二维
for (long k = 0; k < (long)3; k++)
{
lIndex[0] = k;
for ( long num = 0; num < (long)3; num++ )
{
lIndex[1] = num;
SafeArrayPutElement (psa, lIndex, &arg2[k][num]); //

}
}
varArg1.vt = VT_ARRAY &brvbar VT_I4; // 整型数组
varArg1.parray = psa; // 存储数据

VARIANT varRet = oFun.MInverse( varArg1 );
// 其实结果是正确的,只是开始没有找到提取逆矩阵的方法
// 我通过计算矩阵值的函数来计算逆矩阵,结果与Excel中的吻合
double varVal = oFun.MDeterm( varRet ); // 0.125,正确

// 于是寻找提取逆矩阵的方法
// 定义一个动态的二维数组
VARIANT** arg3;

// 根据逆矩阵的维数和大小分配空间
// 先获取逆矩阵的信息
UINT uDim = SafeArrayGetDim( varRet.parray );
UINT uEleSize = SafeArrayGetElemsize( varRet.parray );
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( varRet.parray, 1, &nDim1UBound );
SafeArrayGetLBound( varRet.parray, 1, &nDim1LBound );
long nDim2UBound;
long nDim2LBound;
SafeArrayGetUBound( varRet.parray, 2, &nDim2UBound );
SafeArrayGetLBound( varRet.parray, 2, &nDim2LBound );
long nDim1Count = nDim1UBound - nDim1LBound + 1;
long nDim2Count = nDim2UBound - nDim2LBound + 1;
// 分配空间
arg3 = new VARIANT *[nDim1UBound];
for ( int nn = 0; nn < nDim1UBound; nn++ )
{
arg3[nn] = new VARIANT[nDim2UBound];
}

// 提取逆矩阵
int x = 0;
int y = 0;
for ( long nDim1 = nDim1LBound; nDim1 <= nDim1UBound; nDim1++ )
{
lIndex[0] = nDim1;
y = 0;
for ( long nDim2 = nDim2LBound; nDim2 <= nDim2UBound; nDim2++ )
{
lIndex[1] = nDim2;
SafeArrayGetElement (varRet.parray, lIndex, &arg3[x][y]); //
y++;
}
x++;
}

// 输出测试结果
for (  i = 0; i < nDim1UBound; i++ )
{
for ( int j = 0; j < nDim2UBound; j++ )
{
CString strMsg;
strMsg.Format( _T( "%f" ), arg3[i][j].dblVal );
AfxMessageBox( strMsg );
}
}

// 释放内存
SafeArrayDestroyData( psa );

for ( nn = 0; nn < nDim1UBound; nn++ )
{
delete[] arg3[nn];
}
delete arg3;

// 逆矩阵
0.25 0.25 -0.75
0 0 0.5
0.75 -0.25 -0.25

long nDim1Count = nDim1UBound - nDim1LBound + 1;
long nDim2Count = nDim2UBound - nDim2LBound + 1;
// 分配空间
arg3 = new VARIANT *[nDim1UBound];
for ( int nn = 0; nn < nDim1UBound; nn++ )
{
arg3[nn] = new VARIANT[nDim2UBound];
}

代码中有段:
分配空间时使用nDim1Count和nDim2Count吧,这是通过上界和下界计算的个数。

释放的时候也使用这两个值。

多谢大哥了。我也成功了。

我很想知道在 c++ 环境下(dos) 怎么实现这个功能,现在是在vc 下实现的。需要怎么修改。
还有,如果这个数组是在 excel 里读取的,该怎么读取?我听说你写过excel 读写程序,应该不难吧?
如果能从excel里直接读取,那就感激不尽了。

我的问题比较多,有点烦人。不过等我能“自食其力”就好了。借用圣经里一句话说就是“愿感动你的圣灵加倍感动我”。
所以请谅解,暂时不能结贴,我再加30分。最后一起给。

并调用计算逆矩阵函数  你用这个功能有什么作用么.要用到做什的地方上呀.让我了解一下他的用途!!!谢谢!!!!

你用的应该是控制台程序吧,Win32 Console,Dos窗口,这没有关系,简单的方法:你在创建工程时,选择支持MFC和ATL。

从Excel文件中读取数据的方法如下:
LPDISPATCH  lpDisp = NULL;
COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
Range oCurCell;
Borders oBorders;
Border oBorder;
// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing) );
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得工作表集
m_oWorkSheets.AttachDispatch( m_oWorkBook.GetSheets(), TRUE );
// 获得指定的工作表
m_oWorkSheet.AttachDispatch( m_oWorkSheets.GetItem( COleVariant( strSheetName ) ), TRUE );
// 获得使用的区域Range( 区域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
// 获得使用的行数
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
m_nWholeRowNum = lgUsedRowNum;
// 获得使用的列数
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
m_nWholeColumnNum = lgUsedColumnNum;

//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

// 申请一个动态的二维数组
// 我当时用的是CStringArray* ,你也可以用其他的方法。
m_pArrayExcelData = new CStringArray[lgUsedRowNum];

// 读取Excel单元格的文本
for ( int i = 0; i < lgUsedRowNum; )
{
for ( int j = 1; j <= lgUsedColumnNum; )
{
oCurCell.AttachDispatch(  m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
VARIANT varItemName = oCurCell.GetText();
CString strItemName;
strItemName = varItemName.bstrVal;
m_pArrayExcelData[i].Add( strItemName );
}
j++;
}
i++;
}

不好意思啊,我实在没有基础. 直接点吧. 我要读取 c:/port/fang.xls  里的第 1 列 ,  3 到30 行到一个数组里. 以上程序要怎么改?
另外,读一个二围数组(如 a1:c30)和读一围(eg. a1:a40)是否有区别?

我读的都是数字.

文本对我作用不大. 我是计量金融学博士,玩的都是数字游戏.

你好,给你改了一下代码,做成了一个函数:
int loadExcelFile( CString strFilePath,
CString strSheetName,
int nLeft,
int nTop,
int nWidth,
int nHeight )
{
LPDISPATCH  lpDisp = NULL;
COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
Range oCurCell;
Borders oBorders;
Border oBorder;
// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing) );
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得工作表集
m_oWorkSheets.AttachDispatch( m_oWorkBook.GetSheets(), TRUE );
// 获得指定的工作表
m_oWorkSheet.AttachDispatch( m_oWorkSheets.GetItem( COleVariant( strSheetName ) ), TRUE );
//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

// // 分配空间
argSrc = new int *[nHeight];
for ( int nn = 0; nn < nHeight; nn++ )
{
argSrc[nn] = new int[nWidth];
}

// 读取数据
int xNum = 0;
int yNum = 0;
for ( int i = nLeft; i <= nHeight; )
{
yNum = 0;
for ( int j = nTop; j <= nWidth; )
{
oCurCell.AttachDispatch(  m_oCurrRange.GetItem( COleVariant( (long)(i)), COleVariant( (long)j ) ).pdispVal, TRUE );
VARIANT varItemName = oCurCell.GetText();
CString strItemName;
strItemName = varItemName.bstrVal;
argSrc[xNum][yNum] = atoi( strItemName );

j++;
yNum++;
}
i++;
xNum++;
}

// 计算
VARIANT varArg1;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0; // 该维的下界
rgsabound[0].cElements = nWidth; // 该维的元素个数
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = nHeight;
long lIndex[2];
psa = SafeArrayCreate(VT_I4, 2, rgsabound); // 二维
for (long k = 0; k < (long)nHeight; k++)
{
lIndex[0] = k;
for ( long num = 0; num < (long)nWidth; num++ )
{
lIndex[1] = num;
SafeArrayPutElement (psa, lIndex, &argSrc[k][num]); //
}
}
varArg1.vt = VT_ARRAY &brvbar VT_I4; // 整型数组
varArg1.parray = psa; // 存储数据

WorksheetFunction oFun;
oFun.AttachDispatch( m_oExcelApp.GetWorksheetFunction(), TRUE );

VARIANT varRet = oFun.MInverse( varArg1 );
double varVal = oFun.MDeterm( varRet ); // 0.125,正确

// 分析结果
UINT uDim = SafeArrayGetDim( varRet.parray );
UINT uEleSize = SafeArrayGetElemsize( varRet.parray );
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( varRet.parray, 1, &nDim1UBound );
SafeArrayGetLBound( varRet.parray, 1, &nDim1LBound );
long nDim2UBound;
long nDim2LBound;
SafeArrayGetUBound( varRet.parray, 2, &nDim2UBound );
SafeArrayGetLBound( varRet.parray, 2, &nDim2LBound );
long nDim1Count = nDim1UBound - nDim1LBound + 1;
long nDim2Count = nDim2UBound - nDim2LBound + 1;

// 分配空间
argMInverse = new VARIANT *[nDim1UBound];
for ( nn = 0; nn < nDim1UBound; nn++ )
{
argMInverse[nn] = new VARIANT[nDim2UBound];
}

int x = 0;
int y = 0;
for ( long nDim1 = nDim1LBound; nDim1 <= nDim1UBound; nDim1++ )
{
lIndex[0] = nDim1;
y = 0;
for ( long nDim2 = nDim2LBound; nDim2 <= nDim2UBound; nDim2++ )
{
lIndex[1] = nDim2;
SafeArrayGetElement (varRet.parray, lIndex, &argMInverse[x][y]); //
y++;
}
x++;
}
for (  i = 0; i < nDim1UBound; i++ )
{
for ( int j = 0; j < nDim2UBound; j++ )
{
CString strMsg;
strMsg.Format( _T( "%f" ), argMInverse[i][j].dblVal );
AfxMessageBox( strMsg );
}
}

// 释放空间
SafeArrayDestroyData( psa );
for ( nn = 0; nn < nDim1UBound; nn++ )
{
delete[] argMInverse[nn];
}
delete argMInverse;

for ( nn = 0; nn < nWidth; nn++ )
{
delete[] argSrc[nn];
}
delete argSrc;

return 0;
}

函数的参数说明:
1.  Excel文件全路径
2.  工作表名称(eg. Sheet1 )
3.  区域起始单元格的横坐标
4.  区域起始单元格的纵坐标
5.  区域的宽度(单元格个数)
6.  区域的高度(单元格个数)

举个例子:做一个Excel文件,内容如下:第一行和第一列表示Excel中的坐标,数据还是用过的测试数据
      A  B  C
1    1 2  1
2  3 4  -1
3  0 2  0

函数的调用方式如下
// 定义变量
int** argSrc;
VARIANT** argMInverse;

函数调用方法:
loadExcelFile( strFilePath,
  strSheetName,
  1,
  1,
  3,
  3 );
由于左上角单元格的坐标是A1,所以第三个参数和第四个参数为1和1
由于是3*3的方阵,所以第五个参数和第六个参数为3和3.
第一个参数和第二个参数就不用说了。

有一点请注意,这个函数的最后,将申请的控件释放,因为函数调用一次,就会根据读取的数据量申请一次空间。
你可以不再函数中释放,但是要记住,用完了一定要释放。

以上,不知道是不是完全符合你的想法。你可以稍作修改。
这里实现了根据数据量动态的分配空间。说明一点,MInverse函数不是只能求方阵么?

还有你说的:“另外,读一个二围数组(如 a1:c30)和读一围(eg. a1:a40)是否有区别? ”
只要坐标对,就都可以读出来,区别在与数据的存储上,要在本地申请二维空间还是以为空间的问题。

这位朋友, 逆矩阵的应用广泛是因为,它可以用来解方程组,几乎所有的问题到最后就是解决一个方程组. 我这里是用来做金融时间序列分析时候,解一个
自回归方程组.

我试验了一下,没有错误,但是程序不能执行. 以下是代码. 忙了一晚上了,快不行了. 还要麻烦一下,很不好意思.

void  initb(double  **&p,  int  row,  int  col) //初始化函数,我自己写的. 
  { 
    p = new  double  *[row]; 
  for(int i=0; i < row;  i++) 
  { 
    p[i]  =  new  double  [col]; 
  }
 
  for(i=0;i <row;i++)/////////////////////// clear to zero;
{
for(int j=0;j <col;j++)
{
p[i][j]=0;
}

}/////////////////////////////////////////
  }   

void CExcelTestDlg::OnExceltest()
{
// TODO: Add your control notification handler code here
_Application ExcelApp;

WorksheetFunction fun;

_Worksheet            m_oWorkSheet;    // 工作表
_Workbook            m_oWorkBook;      // 工作簿
Workbooks            m_oWorkBooks;    // 工作簿集合
Worksheets            m_oWorkSheets;    // 工作表集合
Range                  m_oCurrRange;      // 使用区域

//创建Excel 2000服务器(启动Excel)

if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
exit(1);
}

fun.AttachDispatch(ExcelApp.GetWorksheetFunction(), TRUE );

LPDISPATCH  lpDisp = NULL;
COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
Range oCurCell;
Borders oBorders;
Border oBorder;
int nLeft;
int nTop;
int nWidth;
int nHeight ;
CString strFilePath="fang.xls";  //我把文件放在程序的目录下
CString strSheetName="sheet1";

// 打开文件
lpDisp = m_oWorkBooks.Open( strFilePath,
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing),
  _variant_t(vtMissing) );
// 获得活动的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 获得工作表集
m_oWorkSheets.AttachDispatch( m_oWorkBook.GetSheets(), TRUE );
// 获得指定的工作表
m_oWorkSheet.AttachDispatch( m_oWorkSheets.GetItem( COleVariant( strSheetName ) ), TRUE );
//得到全部Cells,此时,CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );

// // 分配空间
double **argSrc ;
initb(argSrc,3,3); //初始化2围动态数组

// 读取数据
int xNum = 0;
int yNum = 0;
for (int  i = nLeft; i <= nHeight; )
{
yNum = 0;
for ( int j = nTop; j <= nWidth; )
{
oCurCell.AttachDispatch(  m_oCurrRange.GetItem( COleVariant( (long)(i)), COleVariant( (long)j ) ).pdispVal, TRUE );
VARIANT varItemName = oCurCell.GetText();
CString strItemName;
strItemName = varItemName.bstrVal;
argSrc[xNum][yNum] = atoi( strItemName );

j++;
yNum++;
}
i++;
xNum++;
}

UpdateData(true);

m_edit=argSrc[0][0]; //输出一个元素

UpdateData(false);

}

你好,即使把文件放在应用程序的目录下,在打开时也需要传递全路径。试一下看看

很抱歉, 问题依旧啊。

m_oWorkSheets.AttachDispatch( m_oWorkBook.GetSheets(), TRUE ); //调试发现  access violation

m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); //调试发现  access violation

到底是怎么回事呢?

CString strFilePath="c:\ExcelTest\liu.xls"; 

CString strSheetName="Sheet1";

我用 LPCTSTR 定义文件名也不行,还是那个问题

你调试的时候看一下m_oWorkBooks.Open(……)返回的lpDisp是否为空。
因为只有它为空时,才会出现你上述的异常。

解决办法:
在ExcelApp.CreateDispatch("Excel.Application",NULL)之后加上下面语句:
//设置为显示
m_oExcelApp.SetVisible(FALSE);
m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE );

在ExcelApp.CreateDispatch("Excel.Application",NULL)之后加上下面语句:

// 把程序设置为隐藏
m_oExcelApp.SetVisible(FALSE);
// 获得所有的工作簿
m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE );

之后你再调试一下,看看lpDisp指针是否为空?

lpDisp 指针为空

以上都通过了,就是到一下这句的时候,出现大差差消息框

m_oCurrRange.AttachDispatch(  m_oCurrRange.GetItem( COleVariant( (long)(i)), COleVariant( (long)j ) ).pdispVal, TRUE );

lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg); //这句执行时候 弹出消息框,就是一个大红差

不好意思, lpDisp 显示0×001e9884

你的i, j是用来指定坐标的。
这个坐标必须是大于0的数。= 0; < 0 都会出现异常。
请调试检查。

我把定义改了
int nLeft=1;
int nTop=1;
int nWidth=3;
int nHeight=3 ;

但是现在只能显示 第一行的前两个数值,后面的都是0

调试,
1. 看看你的坐标是否正确?
2. varItemName.bstrVal是否为空?因为空字符串,转换为整数时是0
3. 你的数据是否是0.25之类的,这样的小数,需要使用atof进行转换,使用atoi,四舍五入后就剩0了。

你说的没有错,当运行到第三个数时候,[1][3],往后就全部是空字符串,我里面都是整数,没有最后那个问题。

坐标我也看过了,是对的 i , j 显示是对的

你是否可以把 MSN 或者QQ号码留下,这样可以及时联系,不用象现在这样一个小问题等待好多小时。我的qq 379134763

MSN : liufang0726@hotmail.co.uk

我加了你的MSN了,不知你收没收到,我的MSN是lengqiuhun@hotmail.com

到底是哪里除了问题呢,就是只能读出两个数字。后面的都是空字符串 ?

Tags: , , ,

[新手][读取][方图]新手求C++读取直方图数据程序

08月 18th, 2008 by admin
Posted in VC/MFC | No Comments »

各位大侠,我是一个初学者,现在要编写一个直方图的匹配程序,现在有个bmp图,但是不知道怎样把图像里面的像素数据提取出来,进行下一步的数据处理,请各位指点一下。

这位大哥,能不能说的详细一点,小弟接触C++只有半个月时间,谢谢了

1.把BMP读入内存
2.分析一下BMP的各个参数,把宽度和高度找出来
3.按像素计算灰度值进行统计,计算灰度值fGray=(float)(Red*0.299+Green*0.587+Blue*0.114);
4.输出灰度值

void CXbwDlg::OnButtonLoad()
{
// TODO: Add your control notification handler code here
char szFilter[] = "Bmp File (*.bmp)*.bmpAll Files (*.*)*.*";//文件滤波器
CFileDialog dlg(TRUE);
CString strTemp;
CString strTemp1;
CString strNamaFile;
ULONG ulJumlahRecords;
int iLoopRecNo = 0;
//
CxImage imgTemp;
CxImage rfft1;
CxImage ifft1;
int iWidth = 256;
int iHeight = 256;

int iPixelSize = 1; // 1=GrayScale, 3=24bpp, 4=32bpp
int iBlockSize = 16;
int i = iWidth/iBlockSize;
int j = iHeight/iBlockSize;

int iRow;
int iCol;
int iLoopRow;
int iLoopCol;
double dTemp;
int iBlockNum = 0;
long lVal1;
BYTE *pImage;

//
//
//
ulJumlahRecords = 0L;
//dlg.m_ofn.lpstrInitialDir = m_strLokasiLogFile;
dlg.m_ofn.lpstrFilter = szFilter;

if( dlg.DoModal() == IDOK )
{
strNamaFile = dlg.GetPathName();
m_imgLoaded.Load(strNamaFile, CXIMAGE_FORMAT_BMP);
char* s = m_imgLoaded.GetLastError();
RefreshDisplay();

if( !m_imgLoaded.IsValid() ) return;

//
imgTemp.Copy(m_imgLoaded);
imgTemp.Resample(iWidth, iHeight);
imgTemp.FFT2(&imgTemp, &imgTemp, &rfft1, &ifft1);
pImage = rfft1.GetBits();

//
for(iRow = 0; iRow < iHeight; iRow += iBlockSize)
{
for(iCol = 0; iCol < iWidth; iCol += iBlockSize )
{
// Block Processing
m_KeySignature[iBlockNum] = 0.0;
dTemp = 0.0;
for(iLoopRow = 0; iLoopRow < iBlockSize; iLoopRow++ )
{
for(iLoopCol = 0; iLoopCol < iBlockSize; iLoopCol++ )
{
lVal1 = pImage[((iRow+iLoopRow)*iPixelSize*iWidth) + ((iCol+iLoopCol)*iPixelSize)];
dTemp += (double) lVal1;
}
}

m_KeySignature[iBlockNum] = sqrt(dTemp);
iBlockNum++;
}
}

//
// Normalize
//
dTemp = 0;
for(i = 0; i < 256; i++ )
{
dTemp += m_KeySignature[i];
}

for(i = 0; i < 256; i++ )
{
m_KeySignature[i] /= dTemp;
}

}
else
{
AfxMessageBox("Please select a BMP file!");
return;
}
我就是根据这个直方图算法来,比较图片相似性的

Tags: , , ,

[读取][网卡][数据]怎么样在VC中读取网卡数据

08月 7th, 2008 by admin
Posted in VC/MFC | No Comments »

如果我想读网卡中的数据是不是用
sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)
然后直接用sendto和recvfrom就可以了
还是有别的方法,谢谢了
急用

引用楼主 ydl118907 的帖子:
如果我想读网卡中的数据是不是用
sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)
然后直接用sendto和recvfrom就可以了
还是有别的方法,谢谢了
急用

你想要哪一层的数据?

SOCK_RAW,原始socket,可以收到ICMP,IP及更上层的数据包。

开发底层网卡驱动,直接读取网卡接受的数据!

Tags: , , ,