本帖最后由 李言 于 2015-7-19 21:57 编辑
//
// main.m
// 计算代码行数
//
// Created by 李言 on 15/7/19.
// Copyright (c) 2015年 ly. All rights reserved.
/*
计算自己学习过程中敲的代码量
*/
#import <Foundation/Foundation.h>
// 声明行数计算函数
NSUInteger lineCount(NSString *f);
int main() {
// 调用行数计算函数
// 传入要计算行数的文件(夹)的路径
NSUInteger num = lineCount(@"/Users/liyan/Desktop/oc练习/玩转三国");
NSLog(@"%lu", num);
return 0;
}
// 定义行数计算函数
// [f characterAtIndex:i] 查看字符串指定位置的字符
NSUInteger lineCount(NSString *f){
// 定义返回值,并初始化为0
NSUInteger m = 0;
// 获得文件管理者
NSFileManager *manage = [NSFileManager defaultManager];
BOOL b = NO;
// 判断路径是否存在
BOOL b2 = [manage fileExistsAtPath:f isDirectory:&b];
// 路径不存在,直接返回0
if (!b2) {
NSLog(@"文件不存在");
return 0;
}
// 判断是文件路径还是文件夹路径
if (b) {
NSLog(@"是个文件夹");
// 装着当前文件夹的所有路径(文件夹路径,文件路径),路径都是字符串
// 将这些表示路径的字符串放入一个数组中
NSArray *array = [manage contentsOfDirectoryAtPath:f error:nil];
// 遍历文件夹中所有的文件路径和文件夹路径
for (NSString *fileName in array) {
// 子文件(夹)的全部路径
NSString *file = [NSString stringWithFormat:@"%@/%@", f, fileName];
// 利用递归,将每个文件夹路径都分解成若干个文件路径
// 然后算出单个文件的行数
// 对各个文件里的行数进行累加
m += lineCount(file);
}
}else {
// 文件
NSLog(@"是个文件");
// 获取文件的拓展名
NSString *ext = [f pathExtension];
// 如果拓展名不是.c .m .h的文件将不进行计算行数
if (!([ext isEqualToString:@"h"] || [ext isEqualToString:@"c"] || [ext isEqualToString:@"m"])) {
return 0;
}
// 将文件内容转换成字符串
NSString *s = [NSString stringWithContentsOfFile:f encoding:NSUTF8StringEncoding error:nil];
// 求出字符长度
long int len = [s length];
m = 1;
// 遍历数组,如果又空行,将空行过滤
for (int i=0; i<len-1; i++) {
if ([s characterAtIndex:i] == '\n') {
m++;
i++;
while ('\n' == [s characterAtIndex:i] && i<len-1){
i++;
}
i--;
}
} // 下面方法比较简洁,但是对于删除空行比较麻烦,
// // 利用方法判断字符串被"\n"分割乘了多少部分,
// // 并把每个部分放进数组中
// NSArray *array = [s componentsSeparatedByString:@"\n"];
// // 获取数组元素个数,即行数(每个"\n"就是一行)
// m = [array count];
return m;
}
}
|
|