1、使用fgetc()逐字符读取
使用fgetc()
逐个读取字符,通过检查空格、换行符和制表符来判断单词和行。
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } int chars = 0, words = 0, lines = 0; char ch; int in_word = 0; while ((ch = fgetc(file)) != EOF) { chars++; if (ch == '\n') { lines++; } if (ch == ' ' || ch == '\n' || ch == '\t') { in_word = 0; } else if (in_word == 0) { in_word = 1; words++; } } fclose(file); printf("Characters: %d\nWords: %d\nLines: %d\n", chars, words, lines); return 0; }
2、使用fgets()逐行读取
使用fgets()
逐行读取文件内容,统计字符数时考虑了每行的长度。
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } int chars = 0, words = 0, lines = 0; char buffer[1024]; while (fgets(buffer, sizeof(buffer), file) != NULL) { lines++; chars += strlen(buffer); int in_word = 0; for (int i = 0; buffer[i] != '\0'; i++) { if (isspace(buffer[i])) { in_word = 0; } else if (in_word == 0) { in_word = 1; words++; } } } fclose(file); printf("Characters: %d\nWords: %d\nLines: %d\n", chars, words, lines); return 0; }
3、使用fread()块读取
使用fread()
一次性读取较大的数据块来提高效率,并在读取的块中统计字符、单词和行数。
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } int chars = 0, words = 0, lines = 0; char buffer[1024]; size_t bytesRead; int in_word = 0; while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0) { for (size_t i = 0; i < bytesRead; i++) { chars++; if (buffer[i] == '\n') { lines++; } if (isspace(buffer[i])) { in_word = 0; } else if (in_word == 0) { in_word = 1; words++; } } } fclose(file); printf("Characters: %d\nWords: %d\nLines: %d\n", chars, words, lines); return 0; }
4、使用fscanf()格式化读取
使用fscanf()
逐个单词读取文件内容,计算每个单词的长度来统计字符数。
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return 1; } int chars = 0, words = 0, lines = 0; char word[1024]; while (fscanf(file, "%1023s", word) == 1) { words++; chars += strlen(word); int i = 0; while (word[i] != '\0') { if (word[i] == '\n') { lines++; } i++; } } fclose(file); printf("Characters: %d\nWords: %d\nLines: %d\n", chars, words, lines); return 0; }
5、使用低级别 I/O 函数read()
使用 read()
函数进行低级别文件读取操作,适合需要直接控制文件 I/O 的情况。
#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <ctype.h> int main() { int file = open("example.txt", O_RDONLY); if (file == -1) { perror("Error opening file"); return 1; } int chars = 0, words = 0, lines = 0; char buffer[1024]; ssize_t bytesRead; int in_word = 0; while ((bytesRead = read(file, buffer, sizeof(buffer))) > 0) { for (ssize_t i = 0; i < bytesRead; i++) { chars++; if (buffer[i] == '\n') { lines++; } if (isspace(buffer[i])) { in_word = 0; } else if (in_word == 0) { in_word = 1; words++; } } } close(file); printf("Characters: %d\nWords: %d\nLines: %d\n", chars, words, lines); return 0; }