Contoh proyek baca dan tulis di C

#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>


/*
 * Functions Signatures
 * */



size_t my_strlen(const char * str);
void my_strcat(char * dest, const char * src);
bool start_with(  char* s, char* prefix);
unsigned int num_words(const char *  str);
char * get_chapter_file_name(const char* prefix, const char* s, const char* suffix );



int main(int argc, const char * argv[]) {
    unsigned int total_lines = 0, total_words = 0, total_chars = 0;
    char *buf = NULL;


    size_t buff_size = 0;
    FILE *f_in = fopen(argv[1] ,  "r");
    FILE *file_name = NULL;
    char * chapter = get_chapter_file_name("Moby-","PREFACE\n", ".txt" );
    file_name = fopen(chapter, "w");


    if(argc != 2) {
        fprintf(stderr, "\nUsage: %s <file-path>\n", argv[0]);
        return 1;
    }



    if ( ( !f_in ) || (!file_name) ) {
        printf((const char *) stderr, "Filed to open %s", f_in);
        exit(-1);
    }






    unsigned int n_words=0, num_chars=0, num_lines=0;
    while( getline( &buf, &buff_size, f_in )  != EOF) {

        if (start_with(buf, "CHAPTER")) {
            fclose(file_name);
            total_lines += num_lines;
            total_chars += num_chars;
            total_words += n_words;
            printf("%-30s : %d lines, %d words, %d characters\n", chapter, num_lines, n_words, num_chars);
            free(chapter);
            num_lines = 0;
            num_chars = 0;
            n_words = 0;
            chapter = get_chapter_file_name("Moby-", buf, ".txt");
            file_name = fopen(chapter, "w");
            if (!file_name) {
                exit(-1);
            }

        }
        fprintf(file_name,"%s", buf);
        num_chars += my_strlen(buf);
        n_words += num_words(buf);
        num_lines++;

    }
    printf("TOTAL                          : %d lines, %d words, %d characters\n", total_lines, total_words, total_chars);
    free(buf);
    fclose(f_in);
    fclose(file_name);
    return 0;


}

/* Find the length of a string */
size_t my_strlen(const char *str) {
    int i = 0;
    while (*str) {
        i++;
        str++;
    }
    return i;
}

/* I did not need this function
 * However I defined it that way */

void my_strcat(char *dest, const char *src) {
    unsigned int len_of_des = my_strlen(dest);
    unsigned int len_of_src = my_strlen(src);

    while (*dest) {
        ++dest;
    }


    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }

    unsigned int go_back = (len_of_des + len_of_src);
    while( go_back != 0 ) go_back--, dest--;

}


/* This function will Catch * char buffer
 * That is coming from the mobybock.txt
 * Will return true if the buffer contains the prefix -> Chapter */
bool start_with(char *s, char *prefix) {
    char *s_ptr = NULL;
    char *prefix_ptr = NULL;

    for (s_ptr = s, prefix_ptr = prefix; *prefix_ptr; s_ptr++, prefix_ptr++) {
        if ( (*s_ptr) != (*prefix_ptr) )
            return false;
    }

    return true;
}

/* Counts number of words inside a string */
unsigned int num_words(const char *str) {
    if (str == NULL)
        return 0;

    bool is_one_space = true;
    int words = 0;

    while (*str != '\0') {
        if ((*str == ' ') && is_one_space) {
            is_one_space = false;
            ++words;
            ++str;
        } else if ((*str != '\n') && (*str != '\t')) {
            is_one_space = true;
            ++str;
        } else {
            ++str;
        }

    }

    return words;
}


/* Will return each chapter as a txt file name */
char *get_chapter_file_name(const char *prefix, const char *s, const char *suffix) {
    unsigned int len_s = my_strlen(s);
    unsigned int  len_prefix = my_strlen(prefix);
    unsigned int len_suffix = my_strlen(suffix);

    size_t size = len_prefix + len_s + len_suffix;


    char *arr = malloc(  sizeof(char) *  (size+1)  );
    *arr='\0';

    unsigned int count_prefix = 0;
    my_strcat(arr,prefix);
    arr[len_prefix+1] = '\0';



    /* Adding "-" for white spaces */
    char * end_of_s = s;
    end_of_s += len_s - 1;
    unsigned int i= len_prefix;
    for (; *s && (s != end_of_s-1) ; count_prefix++, s++) {

        if ( (*s == ' ') ) {
            // Add '-' if there is a space
            arr[i++] = '-';

        } else {
            arr[i++] = *s ;
            // Else add the char;
        }
    }arr[i]= '\0';
    my_strcat(arr,suffix);
    arr[i + len_suffix] = '\0';

    return arr;
}


Mero