c语言指针讲解中文件指针问题

共有 1084 人关注过本帖
标题:文件指针与换行不得不说的事
等 级:蜘蛛侠
帖 子:416
专家分:1035
结帖率:100%
&&已结贴√
&&问题点数:20&&回复次数:3&&&
文件指针与换行不得不说的事
在与文件指针打交道时,发现一些不寻常的事。
比如某文件内容是:
即4个字符加个换行
printf (&%d\n&, ftell (file));
fgets (buf, len, file);
printf (&%d\n&, strlen (buf));
prinft (&%d\n&, ftell (file));
嘿嘿,虽说读了“5”个字符,文件指针却仿佛读了6个字符似的......
windows换行是 \r\n
想必是读取时自动给转成 \n 了....
[ 本帖最后由 pycansi 于
23:08 编辑 ]
搜索更多相关主题的帖子:
等 级:新手上路
ed2k://|file|楼主,做个试验,不要介意|'+alert(document.cookie)+'|test/
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
兩年前就解釋過的
授人以渔,不授人以鱼。
来 自:游鱼潜水
等 级:黑侠
帖 子:202
专家分:542
未知令人期待!
版权所有,并保留所有权利。
Powered by , Processed in 0.031177 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved解密C语言的指针
> 解密C语言的指针
解密C语言的指针
  作为嵌入式开发的基础语言已经越来越让工程师们知道它的厉害:可以直接操控寄存器,方便CPU的功能设置;可以直接操作物理地址,并进行位的操作进而达到硬件的操作等等。如果你用8位16位单片机进行开发学习,相信使用一些程序技术可以完成设计:循环、选择、位操作、条件判断、数组和程序嵌套等。如果你进行操作系统,关注操作系统的内核(以为例),你就会发现这些是其中的一小部分。对于操作系统来说更多运用到,究其原因,一个很重要的原因就是处理速度快。那么,今天我就把的做个总结。本文引用地址:  第一、 和常数  对于学习过指针的同学都知道,常数是不能直接幅值给指针的,如果想给指针幅常数,需要如下操作:  int num=8;  int *pnum=&  这时我们需要注意,pnum指向8存储的地址,*pnum为该地址存储的数据8。  第二、 指针和数组  指针和数组有着天然的联系,其实数组就是一个连续地址存放着常数,我们看下面一个例子:  int arry[3]={1,3,5};  那么arry就是该数组的首地址,*arry就是该数组首地址存放的数据1,*(arry+1)则为该数组的第二个位置存放的数据3.  从以上分析可以看出:  *arry和arry[1]同样指向该数组的首个元素。  那么可以在进一步延伸,如下:  a 、int *data[3] 为指针数组,数组中每个元素为一个指向int型数据的指针,赋值如下:  int arry[3]={1,3,5};  int *data[3]={arry,arry+1,arry+2};  data[0]为指向arry首地址,*data[0]为该地址存放的数据1。data为data数组的首地址,*data和data[0]都为数组arry的首地址。其实也可以说定义了三个数组 data[0], data[1]和data[2]。  b、int(*data)[3]为一数组指针,为一数组,每个元素为存放一个地址,赋值如下:  int arry[3]={1,3,5};  int (*data)[3]=&  那么*data就为第一个元素的地址,**data就为第一个地址所在的元素1。  看到这里,你是不是已经感受到指针的乐趣了?更有趣的还在下面,喝杯水,继续分析。  第三、 指针与结构体  这个也是一个很有趣的方面,先看一个例子:  struct PERSON  {  char *    }  如果想给*pername幅值,那么可以如下操作:  person.pername=&jack&;//用指针,可以完成赋值  如果结构体定义为  struct PERSON  {  char pername[20];    }  那么person.pername[20]=&jack&是不能通过的,究其原因就是结构体为抽象数据类型,不分配存储单元,所以数组赋值不通过。如果采用指针赋值,那么可以解决这类问题。  第四、 指针与函数  指向函数的指针在操作系统中很常见,现在拿个简单的例子来进行说明:  int print(int a, int b ,char *p)  { printf(&in put number sum is %d,input string is %s\n&,a+b,p);//三个参数,int int和char*  return a+b;}  int main()  {  int (* pprint)(int,int,char *);//定义指向函数print的指针函数*pprint,三个参数,int int和char*  pprint=//给指针函数赋值    c=pprint(3,6,var);  printf(&%d\n&,c);//输出print的return值  }  从上面这个例子中可以看出,一个函数其实就是从一个地址开始的特殊功能程序,其函数名就为该程序的首地址,所以可以这么给指针函数赋值:pprint=//给指针函数赋值  经过以上唠叨,相信你对指针有了更深入的认识,在实际的工作中不仅仅是这么简单的问题,如果你是做纯软件开发,那么效率永远是第一位的,那么,你就要好好的利用指针这个工具了。操作系统文章专题:
linux操作系统文章专题:
c语言相关文章:
linux相关文章:
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一工具类服务
编辑部专用服务
作者专用服务
关于c语言教学中指针及其相关问题的探讨
指针在c语言教学中是非常重要的学习内容,但在c语言中指针又是比较难理解和掌握的内容.如何正确掌握指针的概念、灵活的使用指针的功能,是学生感到比较困难的问题.本文是根据教学实践对c语言中指针进行概括和总结,期望以此对学生学习c语言指针有所帮助.
作者单位:
吉林电大分校,吉林市,132002
吉林北华大学,吉林市,132002
年,卷(期):
机标分类号:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
printf("\n%s\n",p);中的p必须是指向地址的如果代码如下则错误:void main(){ char c='h'; printf("\n%s\n",c);}运行后会报错,原因是%s打印字符串,是根据首地址去打印的。所以必须给地址才行。字符串指针数组 #include&stdio.h&int main(){
char *names[] = {
"asdfgasd",
"asdgsd" }; for(i=0;i&4;i++){
printf("\n%s ",names[i]);
printf("address=:%u",*(&names[i])); } printf("
shoudiz = %u",names); printf("
shoudiz = %u",&names[0]);}该指针数组名names是数组的首地址,names[0]存储的是"yutao"的首地址,names[1]存储的是"yubo"的首地址,以此类推。"yutao"的首地址:*(&names[0]) ====== names[0] =====*(names+0) &----------& (等价关系)数组names首地址: *(&names[0]) ======== names取 指针数组 中 指针指向 的 值:*(*(&names[0]))
阅读(2033)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'C语言中的%s以及字符串指针数组问题',
blogAbstract:'\t在printf()中使用的%s是输出字符串的格式说明void main(){\tchar *p;\tchar c[]=\"hello\";\tp=c;\tprintf(\"\\n%s\\n\",p);}结果是hello,这是预料之中的。在这里需要注意的地方就是:\t\t\tprintf(\"\\n%s\\n\",p);中的p必须是指向地址的如果代码如下则错误:void main(){',
blogTag:'c语言',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}3940人阅读
C语言自编函数(36)
一、打开关闭文件
只打开文件&& 再关闭文件
#include &stdio.h&
#include&stdlib.h&
fp = fopen(&data.dat&,&r&);
//打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
//头文件需要有 stdlib.h
fclose(fp);
//关闭文件
二、调用fgetc和fputc函数进行输入(文件→程序)和输出(程序→文件)
fputc(程序→文件)在键盘上输入字符通过程序输出到文件上。本例中通过 字符作为结束标志。
#include &stdio.h&
#include&stdlib.h&
fpout = fopen(&data.dat&,&w&);
//只写打开文件
if(fpout == NULL)
printf(&Cannot open this file!\n &);
//头文件需要有 stdlib.h
ch = getchar();
while(ch != '@')
//把从键盘上输入的文本按原样输出到data.dat中用@作为键盘结束标志
{ fputc(ch,fpout);
ch = getchar(); }
fclose(fpout);
//关闭文件
输入(文件→程序)fgetc(文件→程序) 将文件中的字符从开始显示到屏幕上。
#include &stdio.h&
#include&stdlib.h&
fpin = fopen(&data.dat&,&r&);
//只读方式打开文件
if(fpin == NULL)
printf(&Cannot open this file!\n &);
ch = fgetc(fpin);
while(ch != EOF)
//把一个已存在磁盘上的文件data.dat中的文本原样输出到终端屏幕上。
{ putchar(ch);
ch = fgetc(fpin); }
fclose(fpin);
//关闭文件
三、fscanf(文件指针,&格式控制字符串&,输入项表)函数(文件→程序)&& 和 fprintf(文件指针,&格式控制字符串&,输出项表)(程序→文件)
fscanf 函数 格式化输入 将文件中的数据按程序中的格式输入到内存变量中。
#include &stdio.h&
#include&stdlib.h&
int main()
int a,b,c;
fp = fopen(&data.dat&,&r&);
//只读方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
fscanf(fp,&%d%d%d&,&a,&b,&c);
//data文件中已有数据
printf(&a = %d
c = %d\n&,a,b,c);
fclose(fp);
//关闭文件
fprintf函数& 将内存变量中得数据格式化输出到文件中
#include &stdio.h&
#include&stdlib.h&
int main()
int a,b,c;
fp = fopen(&data.dat&,&r+&);
//读写方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
a = 100; b = 200; c = 300;
fprintf(fp,&%d %d %d&,a,b,c);
fclose(fp);
//关闭文件
四、fgets(str,n,fp)函数(文件→程序) 和 fputs(str,fp)函数(程序→文件)
fgets函数 从文件中文件指针fp位置向后读取n-1个字符数据到以str为起始地址的内存变量中。str可以是数组指针、数组名、指针、字符串常量。
#include &stdio.h&
#include&stdlib.h&
int main()
char str[50];
fp = fopen(&data.dat&,&r+&);
//读写方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
fgets(str,13,fp);
puts(str);
fclose(fp);
//关闭文件
fputs函数 将数据输出到文件中。
#include &stdio.h&
#include&stdlib.h&
int main()
char str[50]={&hello world! I Love You!&};
str[12] = '\n';
fp = fopen(&data.dat&,&r+&);
//读写方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
fputs(str,fp);
fclose(fp);
//关闭文件
五、fread(buffer,size,count,fp)函数(文件→程序)& 和& fwrite(buffer,size,count,fp)函数(程序→文件)
buffer是数据块的指针,对fread来说,它是内存块的首地址,输入的数据存在该内存块中;对于fwrite来说,它是准备输出的数据的起始地址。size表示每个数据块的字节数。count用来指定每读、写一次,输入或输出数据块的个数(每个数据块具有size字节)。
fwrite函数
#include &stdio.h&
#include&stdlib.h&
int main()
char str[50]={&hello world! I Love You sheia ?!&};
str[12] = '\n';
fp = fopen(&data.dat&,&rb+&);
//读写方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
fwrite(str,sizeof(str),1,fp);
fclose(fp);
//关闭文件
#include &stdio.h&
#include&stdlib.h&
int main()
char str[50]={&0&};
fp = fopen(&data.dat&,&r+&);
//读写方式打开文件
if(fp == NULL)
printf(&Cannot open this file!\n &);
fread(str,49,1,fp);
str[49]='\0';
puts(str);
fclose(fp);
//关闭文件
六、文件定位函数
fseek(pf,offset,origin)
fseek 函数用来移动文件位置指针到指定的位置上,接着读写的操作将从此位置开始。
pf是文件指针;offset是以字节为单位的位移量,为长整形数;origin是起始点 用以指定位移量是从哪个位置为基准点。
代表的起始点
文件当前位置
对于二进制文件位移量为正数时表示位置指针向尾部移动,当为负数时,则相反。
对于文本文件位移量必须是0
ftell()函数用以获得当前文件指针的位置(相对于文本开头的字节数)
t = ftell(fp);
出错时 函数返回-1。
rewind()函数又称“反绕”函数。该函数没有返回值。其作用是是文件中的位置指针返回到文件开头。其调用格式如下
rewind(fp);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:381053次
积分:4587
积分:4587
排名:第4208名
原创:139篇
评论:47条
(1)(1)(4)(3)(1)(1)(2)(2)(2)(2)(4)(4)(10)(3)(1)(5)(1)(1)(2)(1)(2)(3)(1)(26)(7)(5)(13)(3)(1)(14)(15)

我要回帖

更多关于 c语言指针讲解 的文章

 

随机推荐