Η C είναι απλή/Παράμετροι Γραμμής Εντολών

Παράμετροι γραμμής εντολών είναι οτιδήποτε γράφουμε στην κονσόλα μετά το όνομα του προγράμματος που θέλουμε να τρέξουμε και πριν πατήσουμε [Enter].

Όπως είχα αναφέρει κάποτε στο πρώτο άρθρο, η "main()" έχει δύο δυνατές μορφές. Αυτή που χρησιμοποιούσαμε μέχρι τώρα και μια άλλη, που είναι αναντικατάστατη αν θέλουμε να χρησιμοποιήσουμε τις παραμέτρους που μπορεί να έχει δώσει ο χρήστης. Η σύνταξή της είναι πολύ απλή και συγκεκριμένη:

int main(int argc, char* argv[])

τα ονόματα των μεταβλητών, αν και όχι αναγκαστικά, έχουν επικρατήσει έτσι. Λοιπόν, όπως βλέπετε, η main δέχεται δύο παραμέτρους. Η πρώτη είναι ο αριθμός των παραμέτρων της γραμμής εντολών +1 και η δεύτερη είναι ένας πίνακας από αλφαριθμητικά, απ' τα οποία το πρώτο( argv[0] ) είναι πάντα το όνομα του ίδιου του προγράμματος.

Για να εκτυπώσουμε απλά στην κονσόλα τις παραμέτρους θα κάναμε:

/* μέσα στην main */
for (i = 1; i < argc; i++){
    puts(argv[i]);
}

για παράδειγμα, αν καλούσα το παραπάνω πρόγραμμα με "myProgram.exe arg1 arg2 arg3 arg4" θα εκτύπωνε:

arg1
arg2
arg3
arg4

Λοιπόν, αυτός ο μηχανισμός θα μπορούσε να μας ωφελήσει με 1002 τρόπους. Πχ το πρόγραμμά μου θέλει να αποθηκεύσει κάπου τα αποτελέσματά του, άρα του δίνω ένα όνομα αρχείου. Μετατρέπει εικόνες RAW σε BMP, του δίνω το όνομα των αρχείων εισόδου/εξόδου και τις διαστάσεις της εικόνας, και πάει λέγοντας.


Τέλος, ας φτιάξουμε ένα προγραμματάκι που σου λέει το μέγεθος οποιουδήποτε αρχείου κι αν του δώσεις:

#include <stdio.h>

/* Επιστρέφει το μέγεθος του αρχείου, αν δεν το βρει επιστρέφει -1 */
long fileSize(const char* filePath);

int main(int argc, char* argv[])
{
    /* Αυτή η παράμετρος δεν είναι ποτέ μηδέν */
    if (argc == 1)
        puts("No filenames were given.");
    else
    {
        int i;
        for (i = 1; i < argc; i++){
            long file_size = fileSize(argv[i]);

            if (file_size >= 0)
                printf("%s:\n\tSize in bytes: %ld\n", argv[i], file_size);
            else
                printf("Unable to open %s\n", argv[i]);
        }
    }

    return 0;
}

long fileSize(const char* filePath)
{
    FILE* filePtr;
    long file_size = -1;

    /* Ανοίγει σε δυαδική κατάσταση επειδή θέλουμε το
       πραγματικό μέγεθος σε bytes, και όχι το διαμορφωμένο */
    filePtr = fopen(filePath, "rb");
    if (filePtr != NULL)
    {
        /* Στέλνει τον δείκτη στο τέλος του αρχείου */
        fseek(filePtr, 0, SEEK_END);
        /* Κρατάει την θέση του δείκτη, που αντιστοιχεί
           στο μέγεθος του αρχείου */
        file_size = ftell(filePtr);
        /* Πάντα κλείνουμε το αρχείο όταν τελειώσουμε */
        fclose(filePtr);
    }

    return file_size;
}

Είπα Happy Coding? :D