| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1732 人关注过本帖
标题:求解,为什么第一轮循环结束后,返回的当前的位置不是0,而是1
只看楼主 加入收藏
BCCN_cuser
Rank: 1
等 级:新手上路
帖 子:31
专家分:1
注 册:2016-6-28
结帖率:100%
收藏
 问题点数:0 回复次数:6 
求解,为什么第一轮循环结束后,返回的当前的位置不是0,而是1
求解,为什么第一轮循环结束后,返回的当前的位置不是0,而是1

#include<stdio.h>
#include<stdlib.h>
#define CNTL_Z '\032'
#define SLEN 81
int main(void)
{
    char file[SLEN];
    char ch;
    FILE *fp;
    long count ,last;
    puts("Enter the name of the file to be processed:");
    scanf("%80s",file);
    if((fp=fopen(file,"r"))==NULL)
    {
        printf("reverse can't open %s\n",file);
        exit(EXIT_FAILURE);
    }
    fseek(fp,0L,SEEK_END);
    last=ftell(fp);
    for(count=1L;count<=last;count++)
    {
        fseek(fp,-count,SEEK_END);
        ch=getc(fp);
        if(ch!=CNTL_Z&&ch!='\r')
        putchar(ch);
    }
    printf("\n");
    printf("%d\n",ftell(fp));//为什么这里结果不是0,而是1;
    while((ch=getc(fp))!=EOF)
    putc(ch,stdout);
    putchar('\n');
    fclose(fp);
    return 0;
}
搜索更多相关主题的帖子: include Enter count file 
2016-11-24 22:12
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
问题在ch=getc(fp);上//最后一次本来输出值本来为0,但因为getc(fp);导致了fp位移量增加了1L因此要获取fseek的值得要排除使用fseek之后执行getc等干扰~
还有,提示一句,倒读文件输出如果会是中文,则会出现乱码,最好少用~因为一个中文占两个字节,顺序读写和倒序读写文件指针获得的两个字节的内容的顺序是不同的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-25 02:57
BCCN_cuser
Rank: 1
等 级:新手上路
帖 子:31
专家分:1
注 册:2016-6-28
收藏
得分:0 
回复 2楼 九转星河
嗯,多谢解惑。
中文倒序的时候确实是会乱码,那如果要输出倒序的中文要怎么处理,同时为什么说中文占两字节。

还有个之前的问题:关于C语言中文件与变量的概念疑惑,是否变量都同等于文件,还是说只有后缀名的才能成为文件(这样至少文件在电脑上是可见的),如何创建新的文件。
2016-11-25 21:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 

我先回答你第一个问题,第二个问题最好去查资料或者上机调试。
倒序输出中文,虽然可以实现,但比较难以调试,要以两个字节为1组这样倒序。就像   19L20L17L18L15L16L……这样,但由于实现文字与字节匹配调试较为麻烦(两个字节之间匹配错误也会是乱码),而且还要考虑非中文的情况,当然,调试结果是中文的ASCII码小于0~你可以根据这一个判断该字符到底是不是中文。
中文占用两个字节是由中文本来的容量来决定的,假设一个字节能组成n个不同数据的集合,那两个字节的集合就能组成n^2个不同数据的集合。
想想看,几万个汉字一个字节的数据(00000000)顶多只能储存256位(也有ASCII码是128位),由这可以看出用两个字节处理中文也是理所当然的~

额,再回到第二个问题上来,变量和文件是有区别的。变量和文件的储存方式不同。变量定义后是由系统内存分配储存空间的,如果是动态变量,在作用域外会被释放,静态变量主程序执行完后会被释放。而文件一般指外部介质数据上的集合(查书的),也就是说关闭程序也能被系统保留,是以数据实体化的形式保存到磁盘里面的。而且文件读取方式不同与变量的读取方式不同。变量一般是通过地址索引的。而文件没有变量里面的地址概念(当然可以说是文件的路径),读取文件数据是通过外部介质的数据流读取的。一般文件指针指向读取数据的位置不叫地址,而叫位移量。

一般fopen生成的文件分为文本文件和二进制文件。在生成时即使没有加后缀名系统也会默认生成的文件格式。

至于如何创建新文件查查书就行了。

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-26 00:38
BCCN_cuser
Rank: 1
等 级:新手上路
帖 子:31
专家分:1
注 册:2016-6-28
收藏
得分:0 
回复 4楼 九转星河
我还是不懂第二个问题,像下面这个程序,为什么一个变量(name这个数组)通过将文件的数据流argv[1]赋给它就可以转变为文件了?这样这个文件还是变量吗?如果定义这个变量为自动变量,这个变量转变为文件后是否也是同自动变量具有相同的作用域、存储期、链接。(是的,应该可以通过调试来解决后面的部分疑问。但是我还不懂怎么编写一个项目,搞不懂是不是IDE的问题,这个是另一个问题了,我也在找类似的上机操作来看,但是并没有找到怎么做的,可以的话推荐一本书。谢谢)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 40
int main(int argc,char *argv[])
{
 FILE *in,*out;
 int ch;
 char name[LEN];
 int count=0;
if(argc<2)
{
fprintf(stderr,"Usage: %s filename\n",argv[0]);
exit(EXIT_FAILURE);
 }
 if((in=fopen(argv[1],"r"))==NULL)
 {
fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[1]);
exit(EXIT_FAILURE);
 }
strncpy(name,argv[1],LEN-5);//这就能创造文件?
 name[LEN-5]='\0';
strcat(name,".red");
 if((out=fopen(name,"w"))==NULL)
 {
fprintf(stderr,"Can't creat output file.\n");
exit(3);
 }
 while((ch=getc(in))!=EOF)
 if(count++%3==0)
 putc(ch,out);
 while((ch=getc(out))!=EOF)
 putchar(ch);
if(fclose(in)!=0||fclose(out)!=0)
 fprintf(stderr,"Error in closing files\n");
 return 0;
}


PS:我是想贴在代码里面的,但是贴代码不像之前那样有个小窗口弹出来了,而是下面这样
(这里应该没有文字的)



[此贴子已经被作者于2016-11-27 21:23编辑过]

2016-11-27 20:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
    我的显示乱码,应该是代码问题。其实"w"格式本来就是读取和创造文件,如果不加文件类型,也能创造文件,甚至是后缀名也能凭空创造~只不过读取文件时可能会出问题~

    你那些问题最好上网查查资料,至于书本,我就学C程序设计第四版(教材),但它更偏重于教学用的,更像一本工具书。真的要学好C光靠那本是不够的。我也只是看那本加上自己另外找资料罢了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-28 01:33
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 5楼 BCCN_cuser
strncpy(name,argv[1],LEN-5);//这就能创造文件?
这句怎么可能会建立新文件呢?这句的作用是将argv[1]前LEN-5个字符复制到name里。

if((out=fopen(name,"w"))==NULL)能建立新文件只能是这句才有可能.
w是写入数据,如果文件不存在,建立新文件。
2016-11-28 09:11
快速回复:求解,为什么第一轮循环结束后,返回的当前的位置不是0,而是1
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018107 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved