fopen(打开文件)

定义函数

FILE * fopen(const char * path,const char * mode);

函数说明

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r     打开只读文件,该文件必须存在。
r+   打开可读写的文件,该文件必须存在。
w    打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a    以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+  以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。

返回值

文件顺利打开后,指向该流的 文件指针 就会被返回。若果文件打开失败则返回 NULL,并把错误代码存在 errno 中。

附加说明

一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

范例

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *fp;
fp = fopen("/Users/jianbao/ClionProjects/apue/123.c", "a+");
if (fp == NULL)
{
printf("open fail\n");
}
else
{
printf("open success\n");
}
  fclose(fp); return 0;
}
  getc(由文件中读取一个字符)

定义函数

int getc(FILE * stream);

函数说明

getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回 EOF。虽然 getc() 与 fgetc() 作用相同,但getc()为宏定义,非真正的函数调用。

注意: getchar() 与 getc(stdin) 作用相同。

返回值

getc()会返回读取到的字符,若返回EOF则表示到了文件尾。

范例

参考 fgetc()。

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *fp;
int c; fp = fopen("/Users/jianbao/ClionProjects/apue/123.c", "r");
while ((c = fgetc(fp)) != EOF)
{
printf("%c\n", c);
}
fclose(fp); return 0;
}
  putc(将一指定字符写入文件中)

表头文件

#include <stdio.h>

函数说明

putc()会将参数c转为 unsigned char 后写入参数 stream 指定的文件中。虽然 putc() 与 fputc() 作用相同,但 putc()为宏定义,非真正的函数调用。

返回值

putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

范例

参考fputc()。

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *fp;
char a[28] = "abcdefghijklmnopqrstuvwxyz";
fp = fopen("/Users/jianbao/ClionProjects/apue/123.c", "w");
int i;
for (i = 0; i < 26; i++)
{
fputc(a[i], fp);
}
fclose(fp); return 0;
}
  fprintf(格式化输出数据至文件)

定义函数

int fprintf(FILE * stream, const char * format,.......);

函数说明

fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。

返回值

关于参数format字符串的格式请参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例

#include <stdio.h>

int main(int argc, char **argv)
{
int i = 150;
int j = -100;
double k = 3.14159; fprintf(stdout, "%d %f %x \n", j, k, i);
fprintf(stdout, "%2d %*d\n", i, 2, i); return 0;
}

执行

-100 3.141590 96
150 150
  fscanf(格式化字符串输入)

定义函数

int fscanf(FILE * stream, const char *format, ....);

函数说明

fscanf()会自参数stream的文件流中读取字符串,再根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结构存于对应的参数内。

返回值

成功则返回参数数目,失败则返回-1,错误原因存于errno中。

范例

#include <stdio.h>

int main(int argc, char **argv)
{
int i;
unsigned int j;
char s[5];
fscanf(stdin, "%d %x %5[a-z] %*s %f", &i, &j, s, s);
printf("%d %d %s \n", i, j, s); return 0;
}

执行

10 0x1b aaaaaaaaa bbbbbbbbbb /*从键盘输入*/
10 27 aaaaa
  fseek(移动文件流的读写位置)

定义函数

int fseek(FILE * stream, long offset, int whence);

函数说明

fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数 whence 来移动读写位置的位移数。

参数

whence为下列其中一种:

  • SEEK_SET:从距文件开头 offset 位移量为新的读写位置。
  • SEEK_CUR:以目前的读写位置往后增加 offset 个位移量。
  • SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量。

当 whence 值为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET); // 等价于 rewind(stream);
2) 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);

返回值

当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。

附加说明

fseek()不像 lseek() 会返回读写位置,因此必须使用 ftell() 来取得目前读写的位置。

范例

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *stream;
long offset;
fpos_t pos;
stream = fopen("/etc/passwd", "r"); fseek(stream, 5, SEEK_SET);
printf("offset=%d\n", ftell(stream)); rewind(stream);
fgetpos(stream, &pos);
printf("offset=%d\n", pos); pos = 10;
fsetpos(stream, &pos);
printf("offset=%d\n", ftell(stream)); fclose(stream); return 0;
}

执行

offset=5
offset=0
offset=10

Linux C 文件输入输出函数 fopen()、getc()/fgetc()、putc()/fputc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解的更多相关文章

  1. matlab学习笔记5--低级文件输入输出函数

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  2. 文件输入输出函数fgetc/fputc及fgets/fputs等文件指针位置的变化

    文件打开后才可以对文件进行操作.也就是说,文件必须经历打开-操作-关闭的过程.如前所述,C语言对文件的操作都是通过调用标准I/O库函数来实现的.文件操作实际是指对文件的读写.文件的读操作就是从文件中读 ...

  3. 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用

    //程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...

  4. Linux C 程序 输入输出函数(THREE)

    标准输入输出函数#include<stdio.h>stdio 是 standard input & output 的缩写 字符数据输入输出函数: putchar() , getch ...

  5. 第15.44节、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  6. ClouderManager集群在Linux里浏览器默认是英文,在Win里浏览器是中文,怎么更改?(图文详解)

    不多说,直接上干货! 问题详情 在这里面如何英文改中文的吗? 莫非要把linux的语言环境给改了?? 我找找网页的语言字体怎么更改下 找到对应页面,修改成中文 解决办法 刷新下,即可 欢迎大家,加入我 ...

  7. C Primer Plus之文件输入/输出

    文件 一个文件通常就是磁盘上的一段命名的存储区.但对于操作系统来说,文件就会更复杂一些.例如,一个大文件可以存储在一些分散的区段中,或者还会包含一些使操作系统可以确定其文件类型的附加数据. C将文件看 ...

  8. Linux C 文件操作函数(~上善止水~)

    翻翻笔记,整理一下 C 语言中的文件操作函数 ~~~~~~,多注意细节,maybe 细节决定成败~ 1. fopen /* fopen(打开文件) * * 相关函数 open,fclose * * 表 ...

  9. linux下文件描述符的查看及分析

    起因 近期在调试一个Android播放内核是遇到上层传递的是fd(file descriptor),但是在文件播放结束之后调用lseek却提示返回-1,errno=29(#define ESPIPE ...

随机推荐

  1. Excellent Articles

    Lisp The roots of lisp Recursive Functions of Symbolic Expressions and Their Computation by Machine, ...

  2. 枚举Enum使用

    package com.wzy.enumt; public enum Citys { //值为静态常量,每一个常量都是一个实例 BEIJING("北京"), SHANGHAI(&q ...

  3. java1.8常用的函数式接口

    //常用函数式接口 final ; //num++; //第一个为传入参数的类型:第二个为返回数据的类型 Function<int[],String> function = (from) ...

  4. JS重载

    Js 不支持函数的重载,可以用相同的名字在同一作用区域,定义两个函数,而不会引起错误,但真正使用的是最后一个. Js 不会验证传递给函数的参数个数是否和函数定义的参数的个数相同,开发人员定义的函数都可 ...

  5. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

    Dialog详解(包括进度条.PopupWindow.自定义view.自定义样式的对话框)   Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框.本实例就是从实际出发, ...

  6. Unity、Exception Handling引入MVP

    什么是MVP?在“MVP初探”里就有讲过了,就是一种UI的架构模式. 简单的描述一下Unity和Exception Handling Application Block: Unity是一个轻量级的可扩 ...

  7. manachor

    在原字符串每个字符间各插入一个未曾出现的字符,在字符串头插入另一个未出现的字符防止越界,求出的p[i]-1既为以i为中心的最长回文串的长度 void manacher(){ ,id; ;i<=n ...

  8. mtr命令详解

    原文地址:http://blog.hexu.org/archives/1050.shtml 一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,trace ...

  9. PE启动菜单修改工具 MsgDiyer(GfxMenu Message制作工具) V2.0.3官方版

    MsgDiyer基本功能  1.新建message文件.修改现有message文件:2.自定义背景图片:3.制作message字体,包括行高.大小等(目前不兼容WIN7):4.自定义字库:5.导入外置 ...

  10. Html页面禁止鼠标左键复制

    <body leftmargin=0 topmargin=0 oncontextmenu='return false' ondragstart='return false' onselectst ...