回复 15楼 rjsp
下午那个问题已解决,但是要实现的功能没有实现。。我只读出来了第一列的最大值,要求是读出所有的,
然后我在那个基础上修改,我把读到的每一行进行分割,求出每行的最大值,最后用循环去实现所有的最大值,
但是有点混乱了,这部分没做出来。
还有编译的问题是:无法解析的外部符号 "char * __cdecl _tcstok_s(char *,char const *)...查了说是要加lib库,但没有加成功,
所以你能不能再帮我看一下是哪的问题,这个是确定要加lib库吗
(你帮我改过的求txt多行多列的数字的最大值程序,我放到mfc中运行后getline一直是未定义,所以我换了这种的,但是好差这个也没成功)
代码:
// MFCApplication4Dlg.cpp : 实现文件
//
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include "MFCApplication4.h"
#include "MFCApplication4Dlg.h"
#include "afxdialogex.h"
#include "vector"
#include "CString"
#include "array"
#include "TCHAR.H"
#include "string.h"
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
vector<double>m_data;//由于存储截取出来的数据
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCApplication4Dlg 对话框
CMFCApplication4Dlg::CMFCApplication4Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFCApplication4Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCApplication4Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFCApplication4Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN_BUTTON, &CMFCApplication4Dlg::OnBnClickedOpenButton)
ON_BN_CLICKED(IDC_SAVE_BUTTON, &CMFCApplication4Dlg::OnBnClickedSaveButton)
END_MESSAGE_MAP()
// CMFCApplication4Dlg 消息处理程序
BOOL CMFCApplication4Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCApplication4Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFCApplication4Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication4Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
double h;
double m;
CString strFilePath;
void CMFCApplication4Dlg::OnBnClickedOpenButton()
{
// TODO: 在此添加控件通知处理程序代码
// 设置过滤器
TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_OPEN_EDIT,strFilePath);
}
//CStdioFile file;
CString strOneline;
CStdioFile file(strFilePath,CFile::modeRead);
while(file.ReadString(strOneline))
{
//把字符串加到控件中
double temp = 0;
//CString转换成double会有误差...
temp=atof(strOneline);
m_data.push_back(temp);
}
int k= m_data.size();
double dop[1024]={0.0};
for (int i=0;i<k;i++)
{
char* _tcstok_s(char* strToken,const char* strDelimit); //分割读取到的字符串
CString str =_T(strOneline);
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok_s( (LPTSTR)(LPCTSTR)str, seps );
while( token != NULL )
{
token = _tcstok_s( NULL, seps );
m=max(*token,m);
}
dop[i]=m_data[i]; //先把读到的每一行的最大值求出,再用循环实现整个的最大值,但是没成功有点混乱了
h=max(dop[i],h);
}
}
void CMFCApplication4Dlg::OnBnClickedSaveButton()
{
// TODO: 在此添加控件通知处理程序代码
CString buf;
buf.Format(_T("%f"),h);
SetDlgItemText(IDC_SAVE_EDIT,buf);
}