黑马程序员技术交流社区

标题: 做了个程序, 来算一算你一共敲了多少代码 [打印本页]

作者: 李言    时间: 2015-7-19 20:42
标题: 做了个程序, 来算一算你一共敲了多少代码
本帖最后由 李言 于 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;
    }

}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2