1、读文件
要使用C语言读取文件,可以使用size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
,此方法返回成功读取的元素总数会以 size_t
对象返回,size_t
对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
例如,
#include<stdio.h> #define nmemb 3 struct test { char name[20]; int size; } s[nmemb]; int main(){ FILE * stream; int i; stream = fopen("/tmp/fwrite","r"); fread(s,sizeof(struct test),nmemb,stream); fclose(stream); for(i=0;i<nmemb;i++) printf("name[%d]=%-20s:size[%d]=%d\n",i,s[i].name,i,s[i].size); }
文件读取还有其它函数,可以参考下面的文档,
相关函数:C语言File文件处理相关函数
2、获取文件信息
要获取有关文件的更多信息,可以使用int fstat(int fildes, struct stat *buf);
函数。
stat文件信息结构体:
struct stat { dev_t st_dev; /* device */ ino_t st_ino; /* inode */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device type (if inode device) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last change */ };
例如,
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> int main ( int argc, char *argv[]) { struct stat FileAttrib; if (stat("/etc/passwd", &FileAttrib) < 0) printf("File Error Message = %s\n", strerror(errno)); else printf( "Permissions: %d\n", FileAttrib.st_mode ); return 0; }
3、使用 fscanf() 逐行读取文本
fscanf()
读取文件的每一行,并将其存储在 line
中。%99[^\n]
表示读取不超过 99
个字符,且读取到换行符停止。使用 perror()
打印系统错误信息,如果文件无法打开。
#include <stdio.h> int main() { // 打开文件以读取模式 ("r") FILE *file = fopen("example.txt", "r"); // 检查文件是否成功打开 if (file == NULL) { perror("Error opening file"); return 1; } // 定义一个缓冲区存储每一行的内容 char buffer[100]; // 使用 fgets 逐行读取文件内容 while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); // fgets 会读取换行符,无需手动添加 } // 关闭文件 fclose(file); return 0; }
4、使用 fgets() 读取文本文件
fgets()
每次读取一行内容(包括换行符),适合读取较长的文本。buffer
存储读取的行,sizeof(buffer)
确保不会读取超过缓冲区的大小。
#include <stdio.h> int main() { // 打开文件以读取模式 ("r") FILE *file = fopen("example.txt", "r"); // 检查文件是否成功打开 if (file == NULL) { perror("Error opening file"); return 1; } // 定义一个缓冲区存储每一行的内容 char buffer[100]; // 使用 fgets 逐行读取文件内容 while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); // fgets 会读取换行符,无需手动添加 } // 关闭文件 fclose(file); return 0; }
5、使用 fread() 读取二进制文件
fread()
从二进制文件中读取数据块。参数buffer
存储读取内容的数组,sizeof(int)
每个元素的大小。file
文件指针。
#include <stdio.h> int main() { // 打开文件用于二进制读取 ("rb") FILE *file = fopen("data.bin", "rb"); // 检查文件是否成功打开 if (file == NULL) { perror("Error opening file"); return 1; } // 定义一个缓冲区用于存储读取的数据 int buffer[5]; // 使用 fread 读取文件内容 size_t bytesRead = fread(buffer, sizeof(int), 5, file); // 输出读取的内容 printf("Bytes read: %lu\n", bytesRead); for (size_t i = 0; i < bytesRead; i++) { printf("buffer[%lu] = %d\n", i, buffer[i]); } // 关闭文件 fclose(file); return 0; }
6、检查文件是否结束(EOF)
fgetc()
逐字符读取文件内容。EOF(End of File)表示文件结束,fgetc()
返回 EOF
时停止读取。
#include <stdio.h> int main() { // 打开文件以读取模式 ("r") FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } char c; // 使用 fgetc 逐字符读取文件内容 while ((c = fgetc(file)) != EOF) { putchar(c); // 输出字符 } fclose(file); return 0; }