VC和C++按行读取文本文件

1.MFC
   CString FileName="d:\\3.txt",Files="d:\\32.txt",fileString;
  CStdioFile   f,g;   
  if(f.Open(FileName,   CFile::modeRead)   ==   TRUE)   //FileName为打开文件名   
  {   
 g.Open(Files,   CFile::modeWrite); 

 while(f.ReadString(fileString)   !=   FALSE)   //直到读完   
 {   
 //MessageBox(fileString);   //读每行的内容 
g.WriteString( DecimalToBinary(fileString)+"\r\n");
 }   
   }   
CString DecimalToBinary(CString strDecimal)// 将输入的十进制数转换为二进制数
{
int nDecimal = atoi(strDecimal.GetBuffer(0));

int nYushu; //余数
int nShang; //商
CString strBinary = "";
char buff[2];
CString str = "";
BOOL bContinue = TRUE;
while(bContinue)
{
nYushu = nDecimal%2;
nShang = nDecimal/2;
sprintf(buff,"%d",nYushu);
str = strBinary;
strBinary.Format("%s%s",buff,str);
nDecimal = nShang;
if(nShang==0)
bContinue = FALSE;
}
return strBinary;
}
2. c语言

    FILE *fp;
   if(fp=fopen(filename,"r"))
   {

  while(!feof(fp))
  {
  memset(app1,0x00,MAX_PATH);   
  fgets(app1,MAX_PATH,fp);
  strend(app1);//去除fgets取得的'\n'
   
  }
   }
   fclose(fp);

void strend(char *str)
{
    for(int i=0;i<strlen(str);i++)
    {
  if(str[i]=='\n')str[i]='\0';
    }
   

  }
char* FindStr(char* str,char p)
{
//返回最后一个字符p之前的字符串
char* retchar=strrchr(str,p);
int i=(int)(retchar-str+1);
str[i]='\0';
return str;
}
3. C++读取按行读取
#include<string>
#include<iostream>
#include<stdlib.h>
#include<fstream>
int main()
{
std::string file_name="123";
std::ifstream fin(file_name.c_str());
std::string textline[3];
for(int i=0;i<3;++i)
      getline(fin,textline[i],'\n');//遇到换行结束这一行的读取
for(int i=0;i<3;++i)
std::cout<<textline[i]<<'\n';

return 0;
}

 

 C 文件操作

1.fopen、fclose

fopen:功能打开文件

fclose:功能关闭文件

头文件:#include<stdio.h>

定义函数:FILE * fopen(const char * path,const char * mode);

函数参数说明:

path:字符串包含欲打开的文件路径及文件名。
mode:字符串则代表着流形态,取值如下:
"r "打开只读文件,该文件必须存在。
"r+ "打开可读写的文件,该文件必须存在。
"w "打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
"w+ "打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
"a "以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
"a+"以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。

返回值:

文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明

一般而言,打开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

2.fread 和 fwrite:

fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。

声明:

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数解释:

size指出一条记录的长度,nmemb指出要读或写多少条记录,这些记录在ptr所指的内存空间中连续存放,共占size * nmemb个字节,fread从文件stream中读出size * nmemb个字节保存到ptr中,而fwriteptr中的size * nmemb个字节写到文件stream中。

返回值:

读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0。

 

功能:
fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中; buffer是存放读入数据的起始地址(即存放何处)。
fwrite()──从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中。buffer是要输出数据在内存中的起始地址(即从何处开始输出)。

freadfwrite用于读写记录,这里的记录是指一串固定长度的字节,比如一个int、一个结构体或者一个定长数组。

nmemb是请求读或写的记录数,freadfwrite返回的记录数有可能小于nmemb指定的记录数。例如当前读写位置距文件末尾只有一条记录的长度,调用fread时指定nmemb为2,则返回值为1。如果当前读写位置已经在文件末尾了,或者读文件时出错了,则fread返回0。如果写文件时出错了,则fwrite的返回值小于nmemb指定的值。下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体。
3.fseek用法

int fseek(FILE *stream, long offset, int fromwhere);

参数:
第一个参数file指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
不推荐用数字 最好用宏

简言之:
fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。
此函数跟ftell函数结合常用来计算流的长度:
fseek(fp, 0, SEEK_END); long filelength = ftell(fp);

取文件长度
FILE * file;
fseek(file, 0, SEEK_END);
long len=ftell(file);
fseek(file,0,SEEK_SET);

long ftell(FILE * stream);
函数说明
ftell()
用来取得文件流目前的读写位置。参数stream为已打开的文件指针。
返回值
当调用成功时则返回目前的读写位置,若有错误则返回-1errno会存放错误代码。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值