c primer plus第13章总结:文件输入/输出

标准 I\O:

标准文件:
- 标准输入:getchar()、gets()、scanf();
- 标准输出:putchar()、puts()、printf();
- 标准错误输出:提供一个可发送错误消息的逻辑上不同的位置;
二进制模式打开文件时:\r\n表示换行,ctrl+Z 表示结束;
文本模式打开文件时:\n表示换行;

打开文件函数:

fopen()函数:

FILE * fp = fopen(”filename”, “mode”);
成功打开,返回文件指针,不能打开返回NULL;

在使用时,一定要对fp进行严格的判断,否则读写都会失败:
if (fp)
{

}

文件打开模式:
(1)r 打开只读文件,该文件必须存在。
(2)r+ 打开可读写的文件,该文件必须存在。
(3)w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
(4)w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
(5)a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
(6)a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

getc()、getc()函数:(需要指针参数)

ch = getc(fp); // 从指针fp的文件中获得一个字符;遇到文件结尾,getc()会返回EOF;
putc(ch, fpout);// 将字符ch写入到FILE指针fpout指定文件中;
putc(ch, stdout);等效于putch(ch);

fclose()函数:

成功关闭,返回0,否则返回EOF;

if (fclose(fp) != 0)
     printf("Error in closing file %s\n", argv[1]);

标准文件指针:

标准输入、输出、错误:stdin、stdout、stderr;都是FILE型指针,可被用作标准IO的参数;

文件IO:

fprintf()、fscanf()函数:(需要参数指定合适的文件,文件参数为第一个参数)
fprintf(stdout, “……”);
fprintf(fp, “%s”, words);// 输出到文件fp中;
fscanf(fp, “%s”, words);// 将fp内内容读到words数组中;
使用fscanf()和fprint()时,注意添加rewind()指向文件初始位置;

// 从文件读取整型到数组arr
for( int i=0; fscanf(in, "%d,", arr[i]) != EOF; i++);

fgets()、fputs()函数:

fgets()函数接收三个参数,gets()和puts()只接收一个参数)
fgets(buf, MAX, fp); // buf为数组名,MAX为最大长度,fp指向要读取的文件;
读到文件结尾,添加上空字符构成字符串;若正好读完一整行后结束,fgets()会在读完的字符串和空字符之间添加换行符;gets()函数读取后将其丢弃;
fputs()函数接收两个参数,打印的时候不会添加换行符;puts()会添加;
fputs(buf, fp);// buf为字符串地址,fp指向目标文件;

随机存储:fseek()和ftell()函数

fseek()接收三个参数,返回一个int值;
ftell()接收一个参数,返回一个long型值;
实际使用时,通过ftell函数获得文件大小,然后创建需要的内存空间,快速读入需要的数据文件。
fseek(文件指针,偏移量,模式);偏移量必须是一个long型值,为正前移,为负后移;
模式:SEEK_SET 文件开始,SEEK_CUR 当前位置,SEEK_END 文件结尾;
如果一切正常,返回值为0,出现错误返回值为-1;

ftell()函数为long型,返回文件的当前位置;

size_t fwrite()函数:

将二进制数据写入文件,返回成功写入的项目数;
fwrite(buffer, 256, 1, fp);// buffer->fp;

为了防止写入出错,通常通过循环写入来保证准确性:

size_t writtenBytes = 0;
BYTE* p = buffer;
while (writtenBytes < bufferSize) // bufferSize为需要写入的缓存空间
{
    size_t curWrittenBytes = fwrite(p, 256, 1, fp);
    if (curWrittenBytes > 0 )
    {
        writtenBytes += curWrittenBytes;
        p + curWrittenBytes;
}

size_t fread()函数:

将二进制数据从文件读取出来,返回成功读取的项目数;
fread(arr, sizeof(double), 10, fp );// fp->arr;

补充:

memcpy()函数:

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
void *memcpy(void *dest, const void *src, size_t n);

memset()函数:

void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值