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;
}