Podmienky:
- predpokladám u programátora základné znalosti z jazyka C
- nastavenie projektu v sekcii "File_project Property pages->Confihuration properties->General":
- Use of MFC: Use MFC in a Static Library
- Character set: Use Unicode Character Set
- Common Language Runtime support: No Common Language Runtime Support
- Whole Program optimalization: No whole Program optimalization
- nastavenie projektu v sekcii "File_project Property pages->Confihuration properties->Debugging":
- Commond Arguments: Váš testovací súbor C:\test1.txt, ako test vstupného argumentu - parametra. Tento parameter si zadajte len ak sa chystáte program "tzv. debugovať".
Projekt som nazval "File_project", namespace takisto "File_project". Hlavný obsah zdrojového kódu je uložený v súbore "File_project.cpp".
V prílohe je len zdrojový súbor: File_project.cpp. Koncovka cpp nech Vás nemiatne, keďže som aplikáciu programoval v C++. Nič to nemení na tom, že program je programovaný v ANSI C.
V programe chcem demonštrovať spôsob nízkoúrovňového programovania v jazyku C, nízkoúrovňovú prácu s reťazcami. Alokovanie a dealokovanie pamäti pre reťazce.
Program prečíta z textového súboru riadok po riadku priebežne vypisuje riadky na obrazovku. Pre prečítanie jedného riadku mám deklarovanú premennú "line". Veľkosť obsahu alokovanej pamete v tomto reťazci alokujem/realokujem podľa potreby (funkcie "malloc" a "realloc"), podľa maximálnej dĺžky reťazca aktuálne prečítaného riadku. Nealokujem spätne na menší priestor, iba rozšírim v prípade potreby pri dlhšom reťazci ako je aktuáln alokovaná pamäť v reťazci "line". Pamäť alokovanú v reťazci "line" uvoľním na konci programu funkciou "free". Reťazec "line" je v cykle prepisovaný vždy nanovo obsahom prečítaného nového riadku. Odporúčam preštudovať zdrojový kód.
Samozrejme, že v dnešnej dobe sú naprogramované objekty na oveľa efektívnejšiu, prehľadnejšiu prácu pre tento účel. Mne išlo v tomto prípade o to, ako ukázať, čo programátor takýchto objektov musí v pozadí programovať pre novodobých programátorov (zvyknutých na rýchlu prácu), aby im uľahčil prácu.
// File_project.cpp : Defines the entry point for the console application. #include <stdio.h> #include <iostream> #include <conio.h> void Write_out(const char* line, const int bytereader) { char* l = (char *) malloc(bytereader + 1); memcpy(l, line, bytereader); l[bytereader] = (char) 0; printf("%s\n", l); free(l); } int main(int argc, char* argv[]) { //for (int i=0; i<argc; i++)printf("%s\n", argv[i]); if (argc < 2) { printf("No file has been joined as input parameter.\n"); printf("Press any key ...\n"); getch(); return EXIT_FAILURE; } int len = strlen(argv[1])+1; char* FileName = (char *) malloc(len); memcpy(FileName, argv[1], len); const int LINE_BUFFER = 100; FILE* pFile = fopen(FileName, "r"); if (pFile != NULL) { printf("**********************************************************************************\n"); printf("Successfully open file: %s\n", FileName); printf("**********************************************************************************\n"); char* line; char c; int bytereader = 0; int bufferlength = 0; while (fread(&c, sizeof(c), 1, pFile)) { if (c == (char) 13 || c == (char) 10) { if (bytereader > 0) { Write_out(line, bytereader); bytereader = 0; } } else { if (bytereader == bufferlength) { if (bufferlength == 0) line = (char *) malloc(bufferlength += LINE_BUFFER); else line = (char *) realloc(line, bufferlength += LINE_BUFFER); } line[bytereader++] = c; } } if (bytereader > 0) Write_out(line, bytereader); fclose(pFile); if (line != NULL) free(line); } else { printf("Error! Unable to open file: %s\n", FileName); perror(FileName); } free(FileName); //system("pause"); printf("Press any key ...\n"); getch(); return EXIT_SUCCESS; }
Výsledný program v kozole dokáže prečítať obsah súboru a vypísať na obrazovku jednoducho. Stačí v kommand aplikácii napísať: Filep_roject.exe c:\test\test1.txt a obsah súboru bude zobrazený v konzolovom okne. Pozor na obsah veľkých súborov, v takom prípade trvá výpis na obrazovku veľmi dlho:)
S pozdravom.