fopen()

  1. FILE * fopen ( const char * path, const char * mode );
  • *path是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。 如:”F:\Visual Stdio 2012\test.txt”
  • *type参数表示了对打开文件的操作方式。其可采用的操作方式如下:
    filename是要打开文件的
  • 返回指向文件缓冲区的指针, 该指针是后序操作文
    件的句柄。
mode 处理方式 当文件不存在时 当文件存在时 向文件输入 从文件输出
r 读取 出错 打开文件 不能 可以
w 写入 建立新文件 覆盖原有文件 可以 不能
a 追加 建立新文件 在原有文件后追加 可以 不能
r+ 读取/写入 出错 打开文件 可以 可以
w+ 写入/读取 建立新文件 覆盖原有文件 可以 可以
a+ 读取/追加 建立新文件 在原有文件后追加 可以 可以
更多的mode有下列几种形态字符串:
  • r 打开只读文件,该文件必须存在。
  • r+ 打开可读写的文件,该文件必须存在。
  • rb+ 读写打开一个二进制文件,只允许读写数据。
  • rt+ 读写打开一个文本文件,允许读和写。
  • w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  • w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  • a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  • a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
  • wb 只写打开或新建一个二进制文件;只允许写数据。
  • wb+ 读写打开或建立一个二进制文件,允许读和写。
  • wt+ 读写打开或着建立一个文本文件;允许读写。
  • at+ 读写打开一个文本文件,允许读或在文本末追加数据。
  • ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

fclose()

文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。

只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。

文件的关闭也意味着释放了该文件的缓冲区。

  1. int fclose ( FILE * stream );
  • 参 数:stream :指向文件缓冲的指针。
  • 返回值:成功返回0 ,失败返回 EOF(-1)。
  1. void main()
  2. {
  3. FILE* fp = fopen("E:\\coding\\clang\\txt\\111.txt", "a");
  4. fputs("China is great!!!", fp); // 向111.txt 文件追加 China is great!!!
  5. int ret = fclose(fp);
  6. if (ret == 0) {
  7. printf("关闭成功");
  8. }
  9. else {
  10. printf("关闭失败");
  11. }
  12. system("pause");
  13. return;
  14. }

关于 feof 的问题

feof 这个函数,是去读标志位判断文件是否结束的。即在读到文件结尾的时候

再去读一次,标志位才会置位,此时再来作判断文件处理结束状态,文件到结尾。如果

用于打印,则会出现多打一次的的现象。

文件读写api

  • fgetc fputc 按照字符读写文件
  • fputs fgets 按照行读写文件(读写配置文件)
  • fread fwirte 按照块读写文件(大数据块迁移)
  • fprintf 按照格式化进行读写文件
    fprintf(fp, “%s = %s\n”, pKey, pValue)

一次只读写文件中的一个字符 stdio.h

  • int fgetc(FILE *stream);
  • int fputc(int ch,FILE *stream);

用fgetc()函数将文件指针指定的字符读到ch变量中,然后用fputc()函数在屏幕上显示,当读到文件结束标志EOF时,变关闭该文件。

  • int getc(FILE *stream);
  • int putc(int ch,FILE *stream);

在TC中,putc()等价于fput(),getc()等价于fgetc()。

  • int fgetchar(void);
  • int fputchar(int ch);

putchar(c)相当于fputc(c,stdout);getchar()相当于fgetc(stdin)。

int fputc ( int ch, FILE * stream );

  • 功能:将 ch 字符,写入文件。
  • 参数:
    • stream :指向文件缓冲的指针。
    • int : 需要写入的字符。
  • 返回值:写入成功,返回写入成功字符,如果失败,返回EOF。

int fgetc ( FILE * stream );

  • 功能:从文件流中读取一个字符并返回。读取字符,重点是判断,结束条件是什么?通常的作法是依据返回值。
  • 参数: FILE* stream :指向文件缓冲的指针。
  • 返回值: int 正常,返回读取的字符;读到文件尾或出错时,为EOF。
  1. int fgetCAndFputc() {
  2. // FILE* fpw = fopen("E:\\coding\\clang\\txt\\ascii.txt", "w");
  3. for (char ch = 'a'; ch < 'z'; ch++) {
  4. // printf("%3c", fputc(ch, fpw)); //int fputc ( int ch, FILE * stream );
  5. }
  6. printf("\n读取文件开始\n");
  7. FILE* fpr = fopen("E:\\coding\\clang\\txt\\ascii.txt", "r"); // r 当文件不存在时 出错
  8. if (NULL == fpr) {
  9. printf("文件不存在\n");
  10. return -1;
  11. }
  12. //int fgetc ( FILE * stream ); int 正常,返回读取的字符;读到文件尾或出错时,为EOF。
  13. char code;
  14. //while ((code = fgetc(fpr))!=EOF)
  15. while((code=fgetc(fpr)) && !feof(fpr)) //正确的判断文件读取是否结束
  16. {
  17. printf("%3c", code);
  18. }
  19. //fclose(fpw);
  20. fclose(fpr);
  21. return 0;
  22. }

一次读写一行字符(文本操作)

  • char _fgets(char _string,int n,FILE *stream);
  • char _gets(char _s);
  • int fprintf(FILE _stream,char _format,variable-list);
  • int fputs(char _string,FILE _stream);
  • int fscanf(FILE _stream,char _format,variable-list);

区别:

  • gets()函数执行时,只要未遇到换行符或文件结束标志,将一直读下去。因此读到什么时候为止,需要用户进行控制,否则可能造成存储区的溢出。
  • fputs()函数想指定文件写入一个由string指向的字符串,’\0’不写入文件。
  • fprintf()和fscanf()同printf()和scanf()函数类似,不同之处就是printf()函数是想显示器输出,fprintf()则是向流指针指向的文件输出;fscanf()是从文件输入。

int fputs(char _str,FILE _fp)

把 str指向的字符串写入 fp 指向的文件中。

参数及返回解析

  • char * str : 表示指向的字符串的指针。
  • fp : 指向文件流结构的指针。 FILE *
  • int 正常,返0;出错返 EOF。

char _fgets(char _str,int length,FILE *fp)

  • 函数功能
    从 fp 所指向的文件中,至多读 length-1 个字符,送入字符数组str
    中, 如果在读入length-1个字符结束前遇\n或 EOF,读入即结束,字
    符串读入后在最后加一个‘\0’字符。
  • fgets 函数返回有三个条件:
    • 1-读n-1 个字符前遇到\n,读取结束。
    • 2-读n-1 个字符前遇到EOF,读取结束。
    • 3-最多读 n-1 个符。
    • 4-在每读一行后自动追加’\0’。
  • 参数及返回解析
    • char * str :指向需要读入数据的缓冲区。
    • int length :每一次读数字符的字数。
    • FILE* fp : 文件流指针。
  • 返回值 char * 正常,返str 指针;出错或遇到文件结尾 返空指针 NULL。