怎样读取文件中的数据?

时间:2021-11-08 10:04:23
我用VC读取文件可以,用的是:
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


引用楼主 mlpok2000 的帖子:
我用VC读取文件可以,用的是: 
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…

对了,我这样用,数据存在char *pBuf里,但是我想读数据到int data[100]中,
有什么办法吗?

#2


引用楼主 mlpok2000 的帖子:
我用VC读取文件可以,用的是: 
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…

对了,我这样做,将数据存到了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


引用 3 楼 zgl7903 的回复:
C/C++ code
// 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" );…

具体怎么做呢?
我很弱的。。。

#6


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。

怎么个读法?

#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文件名
);

#9


一次读取到CString对象中,再划分依次存入数组中

#10


#11


既然文本中的内容是自定义的,可以将文本中的整数用分隔符隔开,例如“|、#、@”等等符号,读取时根据这些符号来分割到数组里

#12


引用 7 楼 Joephia 的回复:
C/C++ code#include <fstream.h>
//获取文件名abc.txt后,就可以挨个读取了,
//注意每个数之间要用空格,tab,或者回车分开
ifstream f;
f.open("abc.txt");
f>> m_a;
f>> m_b;
...
...
f.close();
UpdateData(FALSE);

 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), 就指向你第二个画图点了

#14


引用 8 楼 foxhill 的回复:
使用INI文件比较简单,可以直接读写int类型数据。 
UNIT GetPrivateProfileInt( 
    LPCTSTR lpAppName              //INI文件中的一个字段名 
    LPCTSTR IpKeyName                  //IpAppName下的一个键名,通俗的讲就是变量名 
    INT nDefault                      //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量 
    LPCTSTR IpFileName                  // 是完整的INI文件名 
);

我存的时候是txt...
这个使用ini怎么具体用呢。。。
谢谢先

#15


引用 13 楼 study_live 的回复:
将数据定义为struct类型, 以结构体写入到文件中,并以结构体读取出来. 
struct st 

Point pt; 
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了

谢谢答复。
由于特殊原因,我存的只能是把数据简单放到txt文件中。不是用结构体来存。

#16


引用 6 楼 mlpok2000 的回复:
引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。 
 
怎么个读法?

就按你上面的代码,把pBuf定义为int*型就可以了。

#17


引用 16 楼 cnzdgs 的回复:
引用 6 楼 mlpok2000 的回复:
引用 4 楼 cnzdgs 的回复: 
如果文件中是二进制形式的数据,直接读到int数组里面就可以。 

怎么个读法? 
 
就按你上面的代码,把pBuf定义为int*型就可以了。

 就是说,pBuf改成 int *pBuf;
其他不变。
哪么怎么存放到m_data[100]中呢?
还是定义int *pBuf[100]?可以用 MoveTo(pBuf[2],0);什么的?
--
看到*我就晕了。。。

#18


首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。

#19


引用 18 楼 cnzdgs 的回复:
首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。

文件里的数据就像这样存: 10 11 23 56 ...
我画线就是先把这些数放到数组里m_data[100],然后就用moveto来画。

#20


问题还没解决。
应该怎么搞啊。。。

#21


 采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零,
那么读取的时候就五位五位的读取了,呵呵! 

#22


引用 21 楼 na_he 的回复:
采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零, 
那么读取的时候就五位五位的读取了,呵呵! 

文件里的数据就像这样存: 10 11 23 56 ... 
哪么我3位3位的读?还是2位2位的读?。。。
还有就是怎么具体实现。【我实在是弱,望具体指导】

#23


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。


同样一个问题,不同的回答体现出不同深度的思路!

#24


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。

如果文件中是文本形式的数据,读取到字符串中然后根据数据格式拆分转换为数值,拆分可以用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


引用楼主 mlpok2000 的帖子:
我用VC读取文件可以,用的是: 
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…

对了,我这样用,数据存在char *pBuf里,但是我想读数据到int data[100]中,
有什么办法吗?

#2


引用楼主 mlpok2000 的帖子:
我用VC读取文件可以,用的是: 
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…

对了,我这样做,将数据存到了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


引用 3 楼 zgl7903 的回复:
C/C++ code
// 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" );…

具体怎么做呢?
我很弱的。。。

#6


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。

怎么个读法?

#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文件名
);

#9


一次读取到CString对象中,再划分依次存入数组中

#10


#11


既然文本中的内容是自定义的,可以将文本中的整数用分隔符隔开,例如“|、#、@”等等符号,读取时根据这些符号来分割到数组里

#12


引用 7 楼 Joephia 的回复:
C/C++ code#include <fstream.h>
//获取文件名abc.txt后,就可以挨个读取了,
//注意每个数之间要用空格,tab,或者回车分开
ifstream f;
f.open("abc.txt");
f>> m_a;
f>> m_b;
...
...
f.close();
UpdateData(FALSE);

 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), 就指向你第二个画图点了

#14


引用 8 楼 foxhill 的回复:
使用INI文件比较简单,可以直接读写int类型数据。 
UNIT GetPrivateProfileInt( 
    LPCTSTR lpAppName              //INI文件中的一个字段名 
    LPCTSTR IpKeyName                  //IpAppName下的一个键名,通俗的讲就是变量名 
    INT nDefault                      //如果INI文件中没有前两个参数指定的字段或者键名,则将此值赋给变量 
    LPCTSTR IpFileName                  // 是完整的INI文件名 
);

我存的时候是txt...
这个使用ini怎么具体用呢。。。
谢谢先

#15


引用 13 楼 study_live 的回复:
将数据定义为struct类型, 以结构体写入到文件中,并以结构体读取出来. 
struct st 

Point pt; 
}*sp;将结构体sp指向文件读取的第一个地址,这就是你第一个画图点了,再将sp指针下移一个sizof(st), 就指向你第二个画图点了

谢谢答复。
由于特殊原因,我存的只能是把数据简单放到txt文件中。不是用结构体来存。

#16


引用 6 楼 mlpok2000 的回复:
引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。 
 
怎么个读法?

就按你上面的代码,把pBuf定义为int*型就可以了。

#17


引用 16 楼 cnzdgs 的回复:
引用 6 楼 mlpok2000 的回复:
引用 4 楼 cnzdgs 的回复: 
如果文件中是二进制形式的数据,直接读到int数组里面就可以。 

怎么个读法? 
 
就按你上面的代码,把pBuf定义为int*型就可以了。

 就是说,pBuf改成 int *pBuf;
其他不变。
哪么怎么存放到m_data[100]中呢?
还是定义int *pBuf[100]?可以用 MoveTo(pBuf[2],0);什么的?
--
看到*我就晕了。。。

#18


首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。

#19


引用 18 楼 cnzdgs 的回复:
首先要确定你的文件中的数据是怎么储存的,与画线的关系是什么。

文件里的数据就像这样存: 10 11 23 56 ...
我画线就是先把这些数放到数组里m_data[100],然后就用moveto来画。

#20


问题还没解决。
应该怎么搞啊。。。

#21


 采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零,
那么读取的时候就五位五位的读取了,呵呵! 

#22


引用 21 楼 na_he 的回复:
采用序列化的形式,或者,读出的时候读出一个整数了,写的时候格式化好了,比如每个整数必须5为,不够的时候补零, 
那么读取的时候就五位五位的读取了,呵呵! 

文件里的数据就像这样存: 10 11 23 56 ... 
哪么我3位3位的读?还是2位2位的读?。。。
还有就是怎么具体实现。【我实在是弱,望具体指导】

#23


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。


同样一个问题,不同的回答体现出不同深度的思路!

#24


引用 4 楼 cnzdgs 的回复:
如果文件中是二进制形式的数据,直接读到int数组里面就可以。

如果文件中是文本形式的数据,读取到字符串中然后根据数据格式拆分转换为数值,拆分可以用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


谢谢各位,问题于昨日搞定
还是看孙鑫的书。。。