void Cxxx::OnReadFile()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle ="我的读文件对话框";
fileDlg.m_ofn.lpstrFilter ="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
if(IDOK==fileDlg.DoModal ())
{
CFile file(fileDlg.GetFileName(),CFile::modeRead);
//char *pBuf;
DWORD dwFileLen;
dwFileLen=file.GetLength ();
pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read (pBuf,dwFileLen);
file.Close ();
MessageBox(pBuf);
}
}
这样可以把txt文件中的内容读入,并显示出来。
但是,我想实现的功能是读取文件中的数据【文件中都是整数】,将数据存到整型数组里。以方便我用moveto,lineto画曲线。
谢谢大家指导~
27 个解决方案
#1
对了,我这样用,数据存在char *pBuf里,但是我想读数据到int data[100]中,
有什么办法吗?
#2
对了,我这样做,将数据存到了Char *pBuf,但是我想把数据读到int data[100]中。
有什么办法吗?
#3
// crt_fscanf.c
// compile with: /W1
// This program writes formatted
// data to a file. It then uses fscanf to
// read the various data back from the file.
#include <stdio.h>
FILE *stream;
int main( void )
{
long l;
float fp;
char s[81];
char c;
if( fopen_s( &stream, "fscanf.out", "w+" ) != 0 )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string",
65000, 3.14159, 'x' );
// Security caution!
// Beware loading data from a file without confirming its size,
// as it may lead to a buffer overrun situation.
// Set pointer to beginning of file:
fseek( stream, 0L, SEEK_SET );
// Read data back from file:
fscanf( stream, "%s", s ); // C4996
fscanf( stream, "%ld", &l ); // C4996
fscanf( stream, "%f", &fp ); // C4996
fscanf( stream, "%c", &c ); // C4996
// Note: fscanf is deprecated; consider using fscanf_s instead
// Output data read:
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
fclose( stream );
}
}
MFC下大致也是这样的意思
比较简单的方法就是把每个数据写入文件的时候格式化成固定长度,这样循环中读出固定长度atol之类的转化一下就可以了
#4
如果文件中是二进制形式的数据,直接读到int数组里面就可以。
#5
具体怎么做呢?
我很弱的。。。
#6
怎么个读法?
#7
#include <fstream.h>
//获取文件名abc.txt后,就可以挨个读取了,
//注意每个数之间要用空格,tab,或者回车分开
ifstream f;
f.open("abc.txt");
f>> m_a;
f>> m_b;
...
...
f.close();
UpdateData(FALSE);
#8
使用INI文件比较简单,可以直接读写int类型数据。
UNIT GetPrivateProfileInt(
LPCTSTR lpAppName //INI文件中的一个字段名
LPCTSTR IpKeyName //IpAppName下的一个键名,通俗的讲就是变量名
INT nDefault //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量
LPCTSTR IpFileName // 是完整的INI文件名
);
UNIT GetPrivateProfileInt(
LPCTSTR lpAppName //INI文件中的一个字段名
LPCTSTR IpKeyName //IpAppName下的一个键名,通俗的讲就是变量名
INT nDefault //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量
LPCTSTR IpFileName // 是完整的INI文件名
);
#9
一次读取到CString对象中,再划分依次存入数组中
#10
好
#11
既然文本中的内容是自定义的,可以将文本中的整数用分隔符隔开,例如“|、#、@”等等符号,读取时根据这些符号来分割到数组里
#12
m_a,m_b是自己定义的数组吗?
就是说我可以写为:
#include <fstream.h>
ifstream f;
f.open("abc.txt");//abc为文件名
for(int i=0;i<100;i++)
{
f>> m_data[i];//m_data[100]是定义好的全局变量: int m_data[100];
}
f.close();
UpdateData(FALSE);
---
这样可以吗?
#13
将数据定义为struct类型, 以结构体写入到文件中,并以结构体读取出来.
struct st
{
Point pt;
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了
struct st
{
Point pt;
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了
#14
我存的时候是txt...
这个使用ini怎么具体用呢。。。
谢谢先
#15
谢谢答复。
由于特殊原因,我存的只能是把数据简单放到txt文件中。不是用结构体来存。
#16
就按你上面的代码,把pBuf定义为int*型就可以了。
#17
就是说,pBuf改成 int *pBuf;
其他不变。
哪么怎么存放到m_data[100]中呢?
还是定义int *pBuf[100]?可以用 MoveTo(pBuf[2],0);什么的?
--
看到*我就晕了。。。
#18
首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。
#19
文件里的数据就像这样存: 10 11 23 56 ...
我画线就是先把这些数放到数组里m_data[100],然后就用moveto来画。
#20
问题还没解决。
应该怎么搞啊。。。
应该怎么搞啊。。。
#21
采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零,
那么读取的时候就五位五位的读取了,呵呵!
那么读取的时候就五位五位的读取了,呵呵!
#22
文件里的数据就像这样存: 10 11 23 56 ...
哪么我3位3位的读?还是2位2位的读?。。。
还有就是怎么具体实现。【我实在是弱,望具体指导】
#23
同样一个问题,不同的回答体现出不同深度的思路!
#24
如果文件中是文本形式的数据,读取到字符串中然后根据数据格式拆分转换为数值,拆分可以用strok()或者CString::Tokenize()或者自己查找分隔符,转换可以用诸如atoi等函数。
#25
Up
#26
ifstream f;
vector<POINT> pt;
FILE *fp;
fopen( &fp, "fscanf.out", "r+" );
while(!eof(fp))
{
POINT p1;
fscanf( fp, "%d %d", &p1.x, &p1.y );
pt.push_back(p1);
}
for (int i=0; i<pt.size(); ++i)
{
pDC->MoveTo((pt[i].x, pt[i].y);
}
#27
谢谢各位,问题于昨日搞定
还是看孙鑫的书。。。
还是看孙鑫的书。。。
#1
对了,我这样用,数据存在char *pBuf里,但是我想读数据到int data[100]中,
有什么办法吗?
#2
对了,我这样做,将数据存到了Char *pBuf,但是我想把数据读到int data[100]中。
有什么办法吗?
#3
// crt_fscanf.c
// compile with: /W1
// This program writes formatted
// data to a file. It then uses fscanf to
// read the various data back from the file.
#include <stdio.h>
FILE *stream;
int main( void )
{
long l;
float fp;
char s[81];
char c;
if( fopen_s( &stream, "fscanf.out", "w+" ) != 0 )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string",
65000, 3.14159, 'x' );
// Security caution!
// Beware loading data from a file without confirming its size,
// as it may lead to a buffer overrun situation.
// Set pointer to beginning of file:
fseek( stream, 0L, SEEK_SET );
// Read data back from file:
fscanf( stream, "%s", s ); // C4996
fscanf( stream, "%ld", &l ); // C4996
fscanf( stream, "%f", &fp ); // C4996
fscanf( stream, "%c", &c ); // C4996
// Note: fscanf is deprecated; consider using fscanf_s instead
// Output data read:
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
fclose( stream );
}
}
MFC下大致也是这样的意思
比较简单的方法就是把每个数据写入文件的时候格式化成固定长度,这样循环中读出固定长度atol之类的转化一下就可以了
#4
如果文件中是二进制形式的数据,直接读到int数组里面就可以。
#5
具体怎么做呢?
我很弱的。。。
#6
怎么个读法?
#7
#include <fstream.h>
//获取文件名abc.txt后,就可以挨个读取了,
//注意每个数之间要用空格,tab,或者回车分开
ifstream f;
f.open("abc.txt");
f>> m_a;
f>> m_b;
...
...
f.close();
UpdateData(FALSE);
#8
使用INI文件比较简单,可以直接读写int类型数据。
UNIT GetPrivateProfileInt(
LPCTSTR lpAppName //INI文件中的一个字段名
LPCTSTR IpKeyName //IpAppName下的一个键名,通俗的讲就是变量名
INT nDefault //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量
LPCTSTR IpFileName // 是完整的INI文件名
);
UNIT GetPrivateProfileInt(
LPCTSTR lpAppName //INI文件中的一个字段名
LPCTSTR IpKeyName //IpAppName下的一个键名,通俗的讲就是变量名
INT nDefault //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量
LPCTSTR IpFileName // 是完整的INI文件名
);
#9
一次读取到CString对象中,再划分依次存入数组中
#10
好
#11
既然文本中的内容是自定义的,可以将文本中的整数用分隔符隔开,例如“|、#、@”等等符号,读取时根据这些符号来分割到数组里
#12
m_a,m_b是自己定义的数组吗?
就是说我可以写为:
#include <fstream.h>
ifstream f;
f.open("abc.txt");//abc为文件名
for(int i=0;i<100;i++)
{
f>> m_data[i];//m_data[100]是定义好的全局变量: int m_data[100];
}
f.close();
UpdateData(FALSE);
---
这样可以吗?
#13
将数据定义为struct类型, 以结构体写入到文件中,并以结构体读取出来.
struct st
{
Point pt;
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了
struct st
{
Point pt;
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了
#14
我存的时候是txt...
这个使用ini怎么具体用呢。。。
谢谢先
#15
谢谢答复。
由于特殊原因,我存的只能是把数据简单放到txt文件中。不是用结构体来存。
#16
就按你上面的代码,把pBuf定义为int*型就可以了。
#17
就是说,pBuf改成 int *pBuf;
其他不变。
哪么怎么存放到m_data[100]中呢?
还是定义int *pBuf[100]?可以用 MoveTo(pBuf[2],0);什么的?
--
看到*我就晕了。。。
#18
首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。
#19
文件里的数据就像这样存: 10 11 23 56 ...
我画线就是先把这些数放到数组里m_data[100],然后就用moveto来画。
#20
问题还没解决。
应该怎么搞啊。。。
应该怎么搞啊。。。
#21
采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零,
那么读取的时候就五位五位的读取了,呵呵!
那么读取的时候就五位五位的读取了,呵呵!
#22
文件里的数据就像这样存: 10 11 23 56 ...
哪么我3位3位的读?还是2位2位的读?。。。
还有就是怎么具体实现。【我实在是弱,望具体指导】
#23
同样一个问题,不同的回答体现出不同深度的思路!
#24
如果文件中是文本形式的数据,读取到字符串中然后根据数据格式拆分转换为数值,拆分可以用strok()或者CString::Tokenize()或者自己查找分隔符,转换可以用诸如atoi等函数。
#25
Up
#26
ifstream f;
vector<POINT> pt;
FILE *fp;
fopen( &fp, "fscanf.out", "r+" );
while(!eof(fp))
{
POINT p1;
fscanf( fp, "%d %d", &p1.x, &p1.y );
pt.push_back(p1);
}
for (int i=0; i<pt.size(); ++i)
{
pDC->MoveTo((pt[i].x, pt[i].y);
}
#27
谢谢各位,问题于昨日搞定
还是看孙鑫的书。。。
还是看孙鑫的书。。。