C 语言读取文本文件及简单格式化处理

C 语言读取文本文件及简单格式化处理


C语言中,基本输入输出只需要包含 stdio.h一个头文件即可,包含了标准输入输出系列 stdin,stdout,stderr ,以及通用文件操作支持,窄字符输入输出基本操作相关函数。

文件读取

I/O 流是 FILE 类型对象,只能通过 FILE* 类型指针访问及操作。每个流与外部物理设备(文件、标准输入流、打印机、序列端口等)关联。

FILE* 指针结构

在系统指定的需要访问设备的信息(例如 POSIX 文件描述符)外,每个流对象保有下列信息:

  1. (C95)字符宽度:未设置、窄或宽。
  2. 缓冲状态:无缓冲、行缓冲、全缓冲。
  3. 缓冲区,可为外部的用户提供缓冲区所替换。
  4. I/O 模式:输入、输出或更新(兼具输入与输出)。
  5. 二进制/文本模式指示器。
  6. 文件尾指示器。
  7. 错误状态指示器。
  8. 文件位置指示器( fpos_t 类型对象),对于宽字符流包含剖析状态( mbstate_t 类型对象(C95))。
  9. (C11)在多个线程读、写、寻位或查询流时避免数据竞争的再入锁。

二进制与文本模式

文本流是被组合进行(零或更多字符加上终止的 ‘\n’ )的有序字符序列。最后一行是否要求终止的 ‘\n’ 是实现定义的。可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中的表示文本(尤其是 Windows OS 上的 C 流在输出时将 \n 转换为 \r\n ,输入时将 \r\n 转换为 \n )。

二进制流是能通透地记录内部数据的有序字符序列。从二进制流读取的数据始终与先前写出到该流者比较相等。仅允许实现后附一些空字符到流结尾。宽二进制流不必终止于初始迁移状态。

POSIX 实现不辨别文本与二进制流(无 \n 或任何其他字符的特殊映射)。

文件访问相关函数

打开文件

FILE *fopen( const char *filename, const char *mode );`

关闭文件

int fclose( FILE *stream );

**返回当前的文件位置指示值 **:

long ftell( FILE *stream );

设置文件位置指示器为 offset 所指向的值

// @parm stream	-	要修改的文件流
// @parm offset	-	相对 origin 迁移的字符数
// @parm origin	-	offset 所加上的位置。它能拥有下列值之一: SEEK_SET 、 SEEK_CUR 、 SEEK_END
int fseek( FILE *stream, long offset, int origin );

**检查是否已抵达给定文件流的结尾 **:

int feof( FILE *stream );

示例代码

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
    }
 
    int c; // 注意:int,非char,要求处理EOF
    while ((c = fgetc(fp)) != EOF) { // 标准C I/O读取文件循环
       putchar(c);
    }
 
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
 
    fclose(fp);
}
发布了23 篇原创文章 · 获赞 5 · 访问量 1841

猜你喜欢

转载自blog.csdn.net/QQ275176629/article/details/104252444