学习笔记2
第九章教材学习笔记
教材知识点
-
I/O库函数是操作系统提供的一组用于进行输入和输出操作的函数。它们是对底层系统调用的封装,提供了更方便和易用的接口。
-
系统调用是操作系统提供的一组函数,用于与硬件设备进行交互和管理系统资源。它们通常是底层的、与具体硬件设备相关的函数。
-
I/O库函数的算法是指在进行输入和输出操作时所采用的具体算法和实现方式。这些算法可以根据不同的需求和环境进行优化,以提高性能和效率。
-
I/O库模式是指在进行输入和输出操作时所采用的模式或方式。常见的模式包括阻塞模式、非阻塞模式和异步模式。阻塞模式是指当进行输入和输出操作时,程序会一直等待直到操作完成;非阻塞模式是指程序会立即返回,而不会等待操作完成;异步模式是指程序会发起操作后立即返回,然后通过回调函数或事件通知的方式来处理操作结果。
-
文件缓冲流是指在进行文件输入和输出操作时所使用的缓冲区。它可以提高文件读写的效率,减少系统调用的次数。常见的文件缓冲流有全缓冲、行缓冲和无缓冲。全缓冲是指当缓冲区满时才进行实际的读写操作;行缓冲是指当遇到换行符时才进行实际的读写操作;无缓冲是指每次进行读写操作都会立即执行。
-
类printf函数是指使用类似于C语言中的printf函数的方式进行格式化输出的函数。它可以根据指定的格式将数据输出到标准输出或指定的文件中。它提供了一种方便和灵活的方式来进行输出操作。
综上所述,I/O库函数是对系统调用的封装,提供了更方便和易用的接口。它们采用不同的算法和模式来进行输入和输出操作,并使用文件缓冲流来提高效率。类printf函数则是一种方便的格式化输出函数。
方法
文件描述符 文件描述符的概念,每个打开的文件都有一个唯一的文件描述符。 open(), close(), fcntl() 等
标准I/O库 标准I/O库提供了更高级的I/O操作,如 printf 和 scanf。 stdio.h 库中的函数,如 fopen(), fclose() 等
文件打开和关闭 如何打开和关闭文件,以及相关的错误处理。 open(), fclose(), perror() 等
文件读取和写入 从文件读取数据和向文件写入数据的方法。 read(), write(), fread(), fwrite() 等
文件定位和截断 定位文件指针和截断文件的方法。 lseek(), fseek(), truncate() 等
缓冲I/O 如何使用标准I/O库进行缓冲I/O操作。 setvbuf(), fflush(), fgets(), fputs() 等
标准I/O错误处理 如何处理标准I/O库中的错误。 feof(), ferror(), perror() 等
文件和目录操作 操作文件和目录的函数,如创建、删除和重命名文件。 rename(), remove(), mkdir(), rmdir() 等
临时文件 创建和使用临时文件的方法。 tmpfile(), mkstemp(), tmpnam() 等
I/O多路复用 使用 select() 和 poll() 等函数进行I/O多路复用操作。 select(), poll(), FD_SET() 等
c语言文件操作
C语言文件操作主要涉及以下几个方面的内容:
-
文件指针:在C语言中,文件被视为一个数据流,通过文件指针来访问和操作文件。文件指针是一个指向FILE类型的指针变量,用于跟踪文件的读写位置和状态。
-
文件打开和关闭:使用fopen函数可以打开一个文件,并返回一个指向该文件的文件指针。文件打开时需要指定文件名和打开模式。常见的打开模式包括读取("r")、写入("w")、追加("a")等。文件操作完成后,需要使用fclose函数关闭文件,释放资源。
-
文件读写:使用fread和fwrite函数可以进行二进制数据的读写操作。它们需要指定要读写的数据、数据大小和数据个数。另外,使用fgets和fputs函数可以进行文本数据的逐行读写操作。
-
文件定位:使用fseek函数可以在文件中定位到指定的位置。它需要指定文件指针、偏移量和起始位置。常见的起始位置包括文件开头(SEEK_SET)、当前位置(SEEK_CUR)和文件末尾(SEEK_END)。
-
文件删除和重命名:使用remove函数可以删除指定的文件。使用rename函数可以将一个文件重命名为另一个文件名。
-
文件错误处理:在进行文件操作时,可能会出现一些错误,如文件不存在、权限不足等。可以使用perror函数和errno变量来获取和处理文件操作的错误信息。
-
文件属性:使用ftell函数可以获取当前文件指针的位置。使用feof函数可以判断文件指针是否已经到达文件末尾。使用ferror函数可以判断文件操作是否发生了错误。
总的来说,C语言文件操作提供了一系列函数来进行文件的打开、关闭、读写、定位等操作。通过文件指针和文件操作函数,可以实现对文件的读取和写入,以及其他相关操作。
苏格拉底挑战
实践截图
对于c语言文件操作在计算机实习时曾完成过一个项目:
代码如下或见附件:
点击查看代码
#include<stdio.h>
#include<string.h>
#define MAX 100
void Opandsh(FILE *fp);
void Baocun(FILE *fp);
void Chazhao(FILE *fp);
void Tihuan(FILE *fp,int hangshu[],char jilu[][MAX]);
void Shanchu(FILE *fp,int hangshu[],char jilu[][MAX]);
void Fuzhi(FILE *fp,char fuzhi[]);
void Zhantie(FILE *fp,char zhantie[],int hangshu[],char jilu[][MAX]);
void Clear(FILE *fp,int hangshu[],char jilu[][MAX]);
void New(FILE *fp);
void Print(FILE *fp,int hangshu[],char jilu[][MAX]);
void Return(FILE *fp,char jilu[][MAX],int hang[]);
int Jilu(FILE *fp,char jilu[][MAX],char filename[]);
int main()
{
FILE *fp;
int instruct,hangshu[1];
char fuzhi[100],jilu[100][MAX];
printf("简单文本编辑器\n");
printf("1.打开指定文件并显示文本内容。\n");
printf("2.将文本保存到指定文件中。\n");
printf("3.在文本中查找一个指定字符串的所有出现。\n");
printf("4.对文本中指定字符串进行替换。\n");
printf("5.在文本中删除部分文本。\n");
printf("6.在文本中复制部分文本。\n");
printf("7.在文本中的任意位置粘贴文本。\n");
printf("8.全部清除已有文本内容。\n");
printf("9.新建一个没有任何内容的文本。\n");
printf("10.向文本输入任何可打印字符。\n");
printf("11.撤销上一次操作。\n");
printf("输入序号以执行操作(输入0结束操作):");
scanf("%d",&instruct);
while(instruct!=0)
{
if(instruct>0&&instruct<=11)
{
switch(instruct)
{
case 1:
Opandsh(fp);
break;
case 2:
Baocun(fp);
break;
case 3:
Chazhao(fp);
break;
case 4:
Tihuan(fp,hangshu,jilu);
break;
case 5:
Shanchu(fp,hangshu,jilu);
break;
case 6:
Fuzhi(fp,fuzhi);
break;
case 7:
Zhantie(fp,fuzhi,hangshu,jilu);
break;
case 8:
Clear(fp,hangshu,jilu);
break;
case 9:
New(fp);
break;
case 10:
Print(fp,hangshu,jilu);
break;
case 11:
Return(fp,jilu,hangshu);
break;
}
printf("输入序号以执行操作(输入0结束操作):");
scanf("%d",&instruct);
}
else
{
printf("无效操作\n");
printf("重新输入序号:");
scanf("%d",&instruct);
}
}
return 0;
}
void Opandsh(FILE *fp)
{
char filename[100],str[100][100];
int xx,hang=0,i,j;
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
printf("输入1显示首页,输入2显示末页,输入3显示下一页,输入4显示上一页,输入0结束显示:");
scanf("%d",&xx);
while(xx!=0)
{
if(xx==1)
{
for(i=0;i<10&&i<hang;i++) puts(str[i]);
printf("\n");
}
else if(xx==2)
{
for(i=(hang/10)*10+hang%10-1;i<hang;i++) puts(str[i]);
printf("\n");
}
else if(xx==3)
{
for(j=0;i<hang&&j<10;i++,j++) puts(str[i]);
printf("\n");
}
else if(xx==4)
{
if(i!=hang)
{
for(j=0,i=i-20;i>=0&&j<10;i++,j++) puts(str[i]);
}
else
{
for(j=0,i=hang-10-hang%10;j<10;i++,j++) puts(str[i]);
}
printf("\n");
}
else printf("无效数字!");
printf("输入1显示首页,输入2显示末页,输入3显示下一页,输入4显示上一页,输入0结束显示:");
scanf("%d",&xx);
}
fclose(fp);
}
void Baocun(FILE *fp)
{
char filename[100],str[100][100],filename2[100];
int hang=0,i;
printf("输入文本所在文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
fclose(fp);
printf("输入保存到的文件名及路径:");
gets(filename2);
if((fp=fopen(filename2,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
for(i=0;i<hang;i++) fputs(str[i],fp);
fclose(fp);
printf("保存成功。\n");
}
void Chazhao(FILE *fp)
{
int a,count=0,i,length,j,wjc;
char filename[100],str[100],ch;
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
fseek(fp,0,SEEK_END);
wjc=ftell(fp);
rewind(fp);
printf("输入指定字符串:");
gets(str);
length=strlen(str);
printf("输入1区分大小写,输入2不区分大小写:");
scanf("%d",&a);
if(a==1)
{
while(feof(fp)!=1)
{
j=0;
for(i=0;i<length;i++)
{
ch=fgetc(fp);
if(ch==str[i]) j+=1;
if(ftell(fp)==wjc) break;
}
count++;
if(j==length) printf("字符串在第%d个字符处。\n",count);
if(ftell(fp)==wjc)
{
printf("查找结束。\n");
break;
}
else fseek(fp,-(length-1),SEEK_CUR);
}
}
else if(a==2)
{
while(feof(fp)!=1)
{
j=0;
for(i=0;i<length;i++)
{
ch=fgetc(fp);
if(ch==str[i]||ch+32==str[i]||ch-32==str[i]) j+=1;
if(ftell(fp)==wjc) break;
}
count++;
if(j==length) printf("字符串在第%d个字符处。\n",count);
if(ftell(fp)==wjc)
{
printf("查找结束。\n");
break;
}
else fseek(fp,-(length-1),SEEK_CUR);
}
}
else printf("无效数字!");
fclose(fp);
}
void Tihuan(FILE *fp,int hangshu[],char jilu[][MAX])
{
char str[100][100],filename[100],str1[100],str2[100];
int i=0,j=0,k,m,count=0,length1,length2,hang=0,locate=0,xz,js=0;
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
fclose(fp);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
hangshu[0]=Jilu(fp,jilu,filename);
fclose(fp);
printf("输入被替换字符串:");
gets(str1);
printf("输入替换结果:");
gets(str2);
length1=strlen(str1);
length2=strlen(str2);
printf("输入1全部替换,输入2只替换一个:");
scanf("%d",&xz);
if(xz==1)
{
for(i=0;i<hang;i++)
{
locate=0;
for(j=0;str[i][j]!='\0';)
{
count=0;
for(k=0;k<length1;k++,j++)
{
if(str[i][j]==str1[k]) count++;
}
if(count==length1)
{
if(length1==length2)
{
for(k=locate,m=0;m<length1;k++,m++) str[i][k]=str2[m];
}
else if(length1>length2)
{
for(k=locate+length1;str[i][k]!='\0';k++) str[i][k-(length1-length2)]=str[i][k];
str[i][k-(length1-length2)]='\0';
for(k=locate,m=0;m<length2;k++,m++) str[i][k]=str2[m];
}
else
{
for(k=0;str[i][k]!='\0';) k++;
for(;k>=locate+length1;k--) str[i][k+length2-length1]=str[i][k];
for(k=locate,m=0;m<length2;k++,m++) str[i][k]=str2[m];
}
}
j=locate+1;
locate++;
}
}
}
else if(xz==2)
{
for(i=0;i<hang&&js==0;i++)
{
locate=0;
for(j=0;str[i][j]!='\0'&&js==0;)
{
count=0;
for(k=0;k<length1;k++,j++)
{
if(str[i][j]==str1[k]) count++;
}
if(count==length1)
{
if(length1==length2)
{
for(k=locate,m=0;m<length1;k++,m++) str[i][k]=str2[m];
}
else if(length1>length2)
{
for(k=locate+length1;str[i][k]!='\0';k++) str[i][k-(length1-length2)]=str[i][k];
str[i][k-(length1-length2)]='\0';
for(k=locate,m=0;m<length2;k++,m++) str[i][k]=str2[m];
}
else
{
for(k=0;str[i][k]!='\0';) k++;
for(;k>=locate+length1;k--) str[i][k+1]=str[i][k];
for(k=locate,m=0;m<length2;k++,m++) str[i][k]=str2[m];
}
js=1;
}
j=locate+1;
locate++;
}
}
}
else printf("无效数字!");
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
for(i=0;i<hang;i++) fputs(str[i],fp);
fclose(fp);
printf("替换结束。\n");
}
void Shanchu(FILE *fp,int hangshu[],char jilu[][MAX])
{
char str[100][100],filename[100];
int i,j,k,hang=0,m;
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
fclose(fp);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
hangshu[0]=Jilu(fp,jilu,filename);
fclose(fp);
printf("被删除文本在第几行:");
scanf("%d",&i);
printf("从该行第几个字符开始:");
scanf("%d",&j);
printf("共几个字符:");
scanf("%d",&k);
for(m=j-1+k;str[i-1][m]!='\0';j++,m++) str[i-1][j-1]=str[i-1][m];
str[i-1][j-1]='\0';
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
for(m=0;m<hang;m++) fputs(str[m],fp);
fclose(fp);
printf("删除成功。\n");
}
void Fuzhi(FILE *fp,char fuzhi[])
{
char str[100][100],filename[100];
int i,j,k,hang=0,m;
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
fclose(fp);
printf("被复制文本在第几行:");
scanf("%d",&i);
printf("从该行第几个字符开始:");
scanf("%d",&j);
printf("共几个字符:");
scanf("%d",&k);
for(m=0;m<k;m++,j++) fuzhi[m]=str[i-1][j-1];
fuzhi[m]='\0';
printf("复制成功。\n");
}
void Zhantie(FILE *fp,char zhantie[],int hangshu[],char jilu[][MAX])
{
char str[100][100],filename[100];
int i,j,k,hang=0,length,m;
length=strlen(zhantie);
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(str[hang],81,fp)!=NULL) hang++;
fclose(fp);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
hangshu[0]=Jilu(fp,jilu,filename);
fclose(fp);
printf("文本粘贴在第几行:");
scanf("%d",&i);
printf("从该行第几个字符处粘贴:");
scanf("%d",&j);
for(k=0;str[i-1][k]!='\0';) k++;
for(;k>=j-1;k--) str[i-1][k+length]=str[i-1][k];
for(k=j-1,m=0;k<j-1+length;k++,m++) str[i-1][k]=zhantie[m];
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
for(m=0;m<hang;m++) fputs(str[m],fp);
fclose(fp);
printf("粘贴成功。\n");
}
void Clear(FILE *fp,int hangshu[],char jilu[][MAX])
{
char filename[100];
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
hangshu[0]=Jilu(fp,jilu,filename);
fclose(fp);
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
fclose(fp);
printf("清除成功。\n");
}
void New(FILE *fp)
{
char filename[100];
printf("输入新建空文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
fclose(fp);
printf("新建成功。\n");
}
void Print(FILE *fp,int hangshu[],char jilu[][MAX])
{
char filename[100],str[100];
printf("输入指定文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
hangshu[0]=Jilu(fp,jilu,filename);
fclose(fp);
if((fp=fopen(filename,"a"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
printf("输入任何可打印字符:");
while(fgets(str,81,stdin)!=NULL) fputs(str,fp);
fclose(fp);
printf("添加成功。\n");
}
void Return(FILE *fp,char jilu[][MAX],int hang[])
{
char filename[100];
int i=0;
printf("输入上一次进行操作的文件名及路径:");
getchar();
gets(filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
for(i=0;i<hang[0];i++) fputs(jilu[i],fp);
fclose(fp);
printf("撤销成功。\n");
}
int Jilu(FILE *fp,char jilu[][MAX],char filename[])
{
int hang=0;
if((fp=fopen(filename,"r"))==NULL)
{
printf("打开错误!");
getchar();
exit(1);
}
while(fgets(jilu[hang],81,fp)!=NULL) hang++;
fclose(fp);
return hang;
}