文件操作的作业项目

第一次使用csdn,今天是12月24日,平安夜。希望可以从今天开始在这里记录自己的成长。

本次编写的程序是有关文件操作的,文件的打开方式,应用读取一类操作。

在编写程序2时出现了一点问题,不知道如何读取固定位置的字符。在查阅了百度之后得到了解决。
以下引用百度回答

C语言中用fseek将指针定位到文件头(SEEK_SET)时,指针是指向文件第一个字符还是在第一个字符之前???
如果是第一个字符,为什么fseek(fp,50L,SEEK_SET)
是将位置指针移到文件头起始第50个字节处而不是第51个字节呢?下图中用ftell读取的位置指针在第一个字符之前是错误的吗?*

cdyzxy

来自电脑网络类芝麻团

推荐于2017-11-21

偏移为0,即第1个字符,指向接下来要操作的首字节位置。

追问

那为什么fseek(fp,50L,SEEK_SET)
是将位置指针移到文件头起始第50个字节处而不是第51个字节呢?下图中用ftell读取的位置指针在第一个字符之前是错误的吗?

追答

这是个理解问题,fp指针指向的位置是文件起始的偏移,这个偏移是0开始计数的,而你操作的文件中的字符,出于习惯是1开始计数的,如果从ftell等于50来说,这个位置是实际字符的第51个位置(从0开始计数),而你可以认为已经隔过去了50个字符,下一个操作的就是第51个字符了。
或者说文件指针的位置是指向下一个要操作的第1个字符位置
ftell是统计文件指针当前位置之前的字符计数

追问

图上的程序,如果用数组表示位置,一开始指针指向a[0],用ftell返回为0,然后再输入字符为什么不给a[0]赋值而是给a[1]赋值呢?而且SEEK_END定位到文件尾又表示指针移到最后一个字符之后的位置

追答

如果你继续写入字符,将会从当前位置写,而当前位置在文件尾部就是还未写入的地方按照你的举例,写入的字符确实是给a[0]赋值的,因为打开文件是位置是0,写入12个字符之后,位于第13个位置,ftell的结果应该是12但fprintf写入的字符串为13个字符fprintf自动将\n符转换成两个字符0x0d、0x0a即一个换行符和一个回车符,这样书中例子实际写入的是13个字符。你可以用二进制打开data.txt进行观察,看是否写入的是13个字符。可以参看我的实验结果如下

追问

谢谢你!因为我的教材里写fseek(fp,50L,0)是将位置指针移到文件头起始第50个字节处所以我产生了这个疑问,现在看来应该是将移到离文件头起始第50个字节处,漏了个离字,是这样吗?再次感谢!

开始我同样对此有所疑问,在看了这个答案之后,这些问题清楚了很多。使用FSEEK进行处理就可以解决。

本次编写的程序

(1)将自然数1-10以及它们的平方根写到名为file1.txt的文件中,然后再读出显示在屏幕上。
(2)任意输入一串字符,将其按字符串写入一个文件,从文件头开始,读取其中第5到10的字符(按单个字读取方式)显示在屏幕上。
(3)将自己本学期所学课程所用的课本信息(图名、出版社、作者、单价)一一写入一个文件,再从中读取并显示其中课程C语言的所用的教材信息

奇妙的是后两个代码无法粘贴

#include “stdio.h”
#include “math.h”
int main(int argc,char *argv[]){
FILE *fp;
int n;
float x;
if((fp=fopen(“file1.txt”,“w+”))==NULL){
printf(“Failed to create file, exit…\n”);
return 0;
}
for(n=1;n<11;fprintf(fp,"%d %f\n",n,sqrt(n)),n++);
rewind(fp);
while(fscanf(fp,"%d%f",&n,&x)==2)
printf("%3d%5.2f\n",n,x);
fclose(fp);
return 0;
}

可以运行但是出现乱码,类型不匹配
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{ FILE *fp;
char str1[100]=“C/C++程序设计\机械工业出版社\作者 编著:范翠香,刘辉 主审:胡便利\价格:45.00元”,str2[40];
if((fp=fopen(“kebenxinxi.txt”,“w”))==NULL)
{ printf(“file can not open!\n”);exit(0);}
fputs(str1,fp);
fclose(fp);
if((fp=fopen(“kebenxinxi.txt”,“r”))==NULL)
{ printf(“file can not open!\n”);exit(0);}
fgets(str2,100,fp);
puts(str2);
printf(“text:%d\n”,strlen(str2));
fclose(fp);
return 0;
}

总体来说,感觉文件操作的有关复杂程度不算太高。掌握的程度尚可,另外,需要注意类型的匹配问题。

猜你喜欢

转载自blog.csdn.net/weixin_44253238/article/details/85239277