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.







