四时宝库

程序员的知识宝库

16.C语言-文件操作2(c语言 操作文件)

fprintf与fscanf

int fprintf(FILE *fp,char *format,...)

将格式化的数据写入流

stream

指向一个指针FILE标识输出流的对象。

format

包含要写入流的文本的C字符串。
它可以选择包含嵌入式_格式说明符_这些值将替换为后续附加参数中指定的值,并按要求设置格式。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  char name[100];
  f = fopen("d:\\4.txt", "w");
  for (int i = 0; i < 3; i++)
  {
    puts("请输入姓名:");
    gets(name);
    fprintf(f, "姓名:%d,%10s\n", i + 1, name);
  }
  fclose(f);
}

rewind 函数

C 库函数 *void rewind(FILE stream) 设置文件位置为给定流 stream 的文件的开头。

void rewind(FILE *stream)

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  char str1[10], str2[10], str3[10];
  int year;
  FILE* fp;

  fp = fopen("file.txt", "w+");
  fputs("We are in 2014", fp);

  rewind(fp);
  fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);

  printf("Read String1 |%s|\n", str1);
  printf("Read String2 |%s|\n", str2);
  printf("Read String3 |%s|\n", str3);
  printf("Read Integer |%d|\n", year);

  fclose(fp);
}

ferror函数

测试给定流 stream 的错误标识

int ferror(FILE *stream)

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  f = fopen("d:\\41.txt", "r");
  if (f == NULL) {
    printf("读取失败");
  }
  else {
    printf("读取成功");
    if (ferror(f) == 0) {
      printf("文件正常");
    }
    else {
      printf("文件出错");
    }
  }
  fclose(f);
}

perror 函数

把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。

void perror(const char *str)

  • str -- 这是 C 字符串,包含了一个自定义消息,将显示在原本的错误消息之前。
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


void main() {
  FILE* f;
  f = fopen("d:\\41.txt", "r");
  if (f == NULL) {
    //打印出错误
    perror("ERROR:");
    return -1;
  }
  fclose(f);
}

Error: : No such file or directory

clearerr 函数

清除给定流 stream 的文件结束和错误标识符。

void clearerr(FILE *stream)

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

clearerr的作用是使文件错误标志和文件结束标志置为0.假设在调用一个输入输出函数时出现了错误,ferror函数值为一个非零值。在调用clearerr(fp)后,ferror(fp)的值变为0。

rewind函数

设置文件位置为给定流 stream 的文件的开头。

void rewind(FILE *stream)

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  f = fopen("d:\\1.txt", "r");
  //没有到文件结尾就继续
  while (!feof(f))
  {
    char c = fgetc(f);
    putchar(c);
  }
  printf("\n");
  rewind(f);//跳到文件头
  char str[100] = { 0 };
  while (fgets(str,100,f)!=NULL)
  {
    printf("%s", str);
  }
  fclose(f);
}

ftell

返回给定流 stream 的当前文件位置。

long int ftell(FILE *stream)

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  int len;
  f = fopen("d:\\1.txt", "r");
  fseek(f, 0, SEEK_END);
  len = ftell(f);
  fclose(f);
  printf("文件长度:%d", len);
}

fseek 函数

设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

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

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • offset -- 这是相对 whence 的偏移量,以字节为单位。
  • whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

常量

描述

SEEK_SET

文件的开头

SEEK_CUR

文件指针的当前位置

SEEK_END

文件的末尾

如果成功,则该函数返回零,否则返回非零值。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  f = fopen("d:\\2.txt", "w+");
  fputs("this is test", f);
  fseek(f, 5, SEEK_SET);
  //从5这个位置开加覆盖
  fputs(" hello ", f);
  fclose(f);
}

在文件尾添加字符

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  f = fopen("d:\\2.txt", "w+");
  fputs("this is test", f);
  fseek(f, 0, SEEK_END);
  //在最后添加
  fputs(" hello ", f);
  fclose(f);
}

取得最后几个字符

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  FILE* f;
  f = fopen("d:\\2.txt", "r");
  fputs("this is test", f);
  //从最后退6个字节
  fseek(f, -6, SEEK_END);
  while (!feof(f))
  {
    char c = fgetc(f);
    putchar(c);
  }
  fclose(f);
}

remove 函数

删除给定的文件名 filename,以便它不再被访问。

int remove(const char *filename)

  • filename -- 这是 C 字符串,包含了要被删除的文件名称。

如果成功,则返回零。如果错误,则返回 -1,并设置 errno。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main() {
  char* path = "D:\\1.txt";
  remove(path);
}

mktemp 函数

char * mktemp(char * template);

mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。

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

头文件是io.h。

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<io.h>

void main() {
    int fd;
    char template[] = "d:\\template-XXXXXX";
    fd = _mktemp(template);
    printf("template = %s\n", template);
}

stat()函数

头文件

#include <sys/stat.h> #include <unistd.h>

int stat(const char * file_name, struct stat *buf);

struct stat
{
  dev_t st_dev; //device 文件的设备编号
  ino_t st_ino; //inode 文件的i-node
  mode_t st_mode; //protection 文件的类型和存取的权限
  nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
  uid_t st_uid; //user ID of owner 文件所有者的用户识别码
  gid_t st_gid; //group ID of owner 文件所有者的组识别码
  dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号
  off_t st_size; //total size, in bytes 文件大小, 以字节计算
  unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.
  unsigned long st_blocks; //number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节.
  time_t st_atime; //time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、utime、read、write 与tructate 时改变.
  time_t st_mtime; //time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、utime 和write 时才会改变
  time_t st_ctime; //time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、权限被更改时更新
};
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<io.h>
#include<sys/stat.h> 

void main() {
  struct stat buf;
  stat("d:/4.txt", &buf);
  printf("size:%d", buf.st_size);
}

mkdir 函数

int mkdir(const char *pathname, mode_t mode);

以mode方式创建一个以pathname为名字的目录,mode定义所创建目录的权限

mode方式:



S_IRWXU

00700权限,代表该文件所有者拥有读,写和执行操作的权限

S_IRUSR(S_IREAD)

00400权限,代表该文件所有者拥有可读的权限

S_IWUSR(S_IWRITE)

00200权限,代表该文件所有者拥有可写的权限

S_IXUSR(S_IEXEC)

00100权限,代表该文件所有者拥有执行的权限

S_IRWXG

00070权限,代表该文件用户组拥有读,写和执行操作的权限

S_IRGRP

00040权限,代表该文件用户组拥有可读的权限

S_IWGRP

00020权限,代表该文件用户组拥有可写的权限

S_IXGRP

00010权限,代表该文件用户组拥有执行的权限

S_IRWXO

00007权限,代表其他用户拥有读,写和执行操作的权限

S_IROTH

00004权限,代表其他用户拥有可读的权限

S_IWOTH

00002权限,代表其他用户拥有可写的权限

S_IXOTH

00001权限,代表其他用户拥有执行的权限

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<io.h>
#include<sys/stat.h> 
#include<sys/types.h>

void main() {
  mkdir("d:\\head", 00700);
}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接