标签:文件 读取 stream int 写入 笔记 学习 第二周 指针
I/O数据库的使用
一、I/O数据库与系统调用
系统调用函数:open()、read()、write()、lseek()、close()
I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()
I/O库函数例
系统调用例
两者区别:
- IO库函数提供了更高级别的接口和抽象,使得输入和输出操作更加方便和易用,而系统函数则提供了对底层系统资源和功能的直接访问,更加灵活和底层。
- 其次从以上代码实现不难看出系统调用open()打开一个文件进行读取,并返回一个整数文件描述符fd,如果open()失败,则返回-1。I/O库函数fopen()返回一个FILE结构体指针,如果fopen()失败,则返回NULL。
- 当库函数没有使用系统调用时,效率是绝对高于系统调用的;当库函数使用了系统调用时,应该根据缓冲区大小和读取方式来决定谁的效率高
二、 I/O库函数的基本算法
1.fopen( ) 算法
*/第一个参数filename:文件路径 ;第二个参数modes:打开文件方式*/
FILE * fopen(const char * filename, const char * modes)
参数 |
含义 |
filename |
文件的路径 |
mode |
文件的打开方式或使用文件的权限 |
返回值 |
如果文件成功打开,fopen() 函数将返回一个指向文件的有效指针。如果打开文件失败,它将返回一个空指针 NULL 。 |
mode常用参数:
"r"
: 只读模式。打开文件用于读取。如果文件不存在,则打开失败。
"w"
: 写入模式。打开文件用于写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
"a"
: 追加模式。打开文件用于写入,但是写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
"r+"
: 读写模式。打开文件用于读取和写入。文件必须存在。
"w+"
: 读写模式。打开文件用于读取和写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
"a+"
: 读写模式。打开文件用于读取和写入。写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
"rb"
: 二进制读取模式。以二进制格式打开文件用于读取。文件必须存在。
"wb"
: 二进制写入模式。以二进制格式打开文件用于写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
"ab"
: 二进制追加模式。以二进制格式打开文件用于写入,但是写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
"r+b"
: 二进制读写模式。以二进制格式打开文件用于读取和写入。文件必须存在。
"w+b"
: 二进制读写模式。以二进制格式打开文件用于读取和写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
"a+b"
: 二进制读写模式。以二进制格式打开文件用于读取和写入。写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
2.fclose( )算法
*/stream:文件指针 返回值:成功0,失败EOF*/
int fclose(FILE * stream)
参数 |
含义 |
stream |
steam是一个指向文件的指针,表示需要关闭的文件 |
返回值 |
返回值为0表示成功关闭文件,而非0值则通常表示在关闭文件时发生了错误。 |
3.fgets( )算法
*/str 存储地址;int n 这是要读取的最大字符数/*
char *fgets(char *str, int n, FILE *stream)
参数 |
含义 |
str |
str是一个字符数组或者说是字符串存储的地址 |
n |
读取的字符数 |
stream |
指向读取文件的指针 |
返回值 |
str中存储的内容,如果在读取时发生错误或到达文件末尾,fgets() 函数将返回 NULL 。 |
4.fread( )算法
*/ptr存储数据的地址、size读取元素的大小、nmemb读取多少个元素、stream文件指针*/
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数 |
含义 |
ptr |
指向存储数据的地址 |
size |
读取元素大小,通常使用sizeof( ) 来判断大小 |
nmemb |
读取元素的个数 |
stream |
指向读取文件的指针 |
返回值 |
读取的数据块数量 |
5.fwrite( )算法
*/ptr待写入数据的地址、size写入元素的大小、nmemb写入多少个元素、stream文件指针*/
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数 |
含义 |
ptr |
指向存储数据的地址 |
size |
写入元素大小,通常使用sizeof( ) 来判断大小 |
nmemb |
写入元素的个数 |
stream |
指向读取文件的指针 |
返回值 |
成功写入的数据块数量 |
6.fseek( )算法
*/stream:文件指针,long offest:指针偏移量,int fram where:指针偏移位置,可取值:SEEK_SET,SEEK_CUR,SEEK_END*/
int fseek(FILE* stream,long offest,int framwhere)
参数 |
含义 |
stream |
操作的文件指针 |
offest |
偏移量,即要移动的字节数 |
frameware |
指定起始位置的方式 |
返回值 |
如果成功,fseek() 函数返回 0。如果发生错误,返回值为非零,表示出现了错误。 |
frameware的常用参数:
SEEK_SET
:起始位置为文件开头。
SEEK_CUR
:起始位置为当前文件位置指针的位置。
SEEK_END
:起始位置为文件末尾。
7. ftell( ) 算法
*/该函数返回位置标识符的当前值*/
long int ftell(FILE *stream)
参数 |
含义 |
stream |
要获取偏移量的文件指针 |
返回值 |
成功返回当前文件位置指针的偏移量,失败返回-1 |
8.fputs( ) 算法
*/str是要写入的字符序列数组*/
int fputs(const char *str, FILE *stream)
参数 |
含义 |
str |
要写入文件的字符串,必须以 null 结尾 |
stream |
写入文件的指针 |
返回值 |
如果成功,fputs() 函数返回非负值,如果发生错误,返回值为 EOF (通常为-1) |
9.fscanf( )算法
*/从文件流中以格式format读取数据*/
int fscanf(FILE * stream, const char * format, ...)
参数 |
含义 |
stream |
读取文件的执政 |
format |
格式字符串,指定了要读取的数据的格式和存储位置 |
…… |
可变数量的参数,用于存储从文件中读取的数据 |
返回值 |
成功返回存储的输入项的数量,发生读取错误或到达文件末尾,返回值可能为负值,未成功匹配任何输入项,返回值为0 |
10.fprintf( )算法
int fprintf(FILE * stream, const char * format, ...)
参数 |
含义 |
stream |
要写入数据的文件指针 |
format |
格式字符串,指定了要写入数据的格式。 |
返回值 |
可变数量的参数,与格式字符串中的格式说明符相对应 |
三、行I/O与字符I/O
1.fgets( )与getc( )
- 功能:
fgetc
函数用于从文件中读取单个字符,并将其作为整数返回。每次调用 fgetc
函数,它会自动向后移动文件指针,以便读取下一个字符。 fgets
函数用于从文件中读取一行字符串,包括换行符(\n
),并将其存储到指定的缓冲区中。每次调用 fgets
函数,它会读取一行字符,直到达到指定的最大字符数、遇到换行符或到达文件结尾。
- 参数:
fgetc
函数接受一个文件指针作为参数,用于指定要读取的文件。 fgets
函数接受三个参数:缓冲区指针、最大读取字符数和文件指针。它会将读取的字符串存储到指定的缓冲区中。
- 返回值:
fgetc
函数返回读取的字符的整数值。如果到达文件结尾或发生错误,它会返回特殊值 EOF
。 fgets
函数返回一个指向读取的字符串的指针。如果到达文件结尾或发生错误,它会返回空指针。
- 读取方式:
fgetc
函数每次只能读取一个字符。 fgets
函数可以读取一行字符,包括换行符,但是如果一行字符超过了指定的最大字符数,它会截断字符串并在末尾添加 \0
。
2.fputs( )与putc( )
- 功能:
fputs
函数用于将字符串写入文件,它会自动写入字符串中的所有字符,直到遇到字符串的结束符 \0
。 putc
函数用于将单个字符写入文件。
fputs
函数接受两个参数:要写入的字符串和文件指针。它会将整个字符串写入到指定的文件中。 putc
函数接受两个参数:要写入的字符和文件指针。它会将指定的字符写入到指定的文件中。
- 返回值:
fputs
函数不返回任何值。 putc
函数返回写入的字符的整数值。如果发生错误,它会返回特殊值 EOF
。
- 写入方式:
fputs
函数会自动写入字符串中的所有字符,直到遇到字符串的结束符 \0
。 putc
函数只能写入一个字符。
四、代码实现
行IO
*/filecopy*/
#include <stdio.h>
int main()
{
FILE *p, *q;
char buff[256];
const char *s = "this is a string";
p = fopen("source.txt", "r");
q = fopen("target.txt", "w");
if (p == NULL || q == NULL) {
printf("Failed to open files.\n");
return 1;
}
fgets(buff, sizeof(buff), p);
fputs(buff, q);
fclose(p);
fclose(q);
return 0;
}
字符IO
*/filecopy*/
#include <stdio.h>
FILE *fp,*gp;
int main()
{
int m;
fp=fopen("source.txt","r");
gp=fopen("target.txt","w");
while ((m=gtec(fp))!= EOF)
putc(m,gp);
fclose(fp);
fclose(gp);
}
使用fread( )与fwrite( )编写一个程序能从键盘输入到文件里
# include<stdio.h>
# include<stdlib.h>
# include<assert.h>
# include<string.h>
int main()
{
FILE* file=fopen("./a.txt","w+");
assert(file!=NULL);
while(1)//循环读取数据
{
printf("input:");
char buff[128]={0};
fgets(buff,128,stdin);//从键盘输入
if(strncmp(buff,"end",3)==0)//比对输入是否为end
{
break;
}
int n=fwrite(buff,sizeof(char),strlen(buff),file);//指针指向的缓冲区,字节大小,数量,文件流*file
if(n==0)
{
printf("fwrite error");
exit(0);
}
}
printf("------fwrite over----------\n");
int n=fseek(file,0L,SEEK_SET);//重定位
if(n==-1)
{
printf("fseek error");
exit(0);
}
while(1)
{
char buff[128]={0};
int n=fread(buff,sizeof(char),128,file);//读取失败返回0
if(n==0)
{
printf("------fread over----------\n");
exit(0);
}
else
{
printf("%s",buff);
}
}
fclose(file);
exit(0);
}
标签:文件,
读取,
stream,
int,
写入,
笔记,
学习,
第二周,
指针
From: https://www.cnblogs.com/qi-yu-lin/p/17706328.html