pondelok, 27 apríl 2015 15:48 Written by 7149 times
Rate this item
(2 votes)

C++ - Čítanie zo súboru a výpis obsahu na obrazovku v riadkoch.

Malá konzolová aplikácia - ako sme voľakedy dávno programovali. Trochu si pripomenieme nižšie programovanie v jazyku C. Budeme programovať prapôvodným spôsobom v ANSI C.

 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.

 

Last modified on utorok, 28 apríl 2015 07:32
Alojz Benďák

Autor je administrátor webu a venuje sa programovaniu takmer 23 rokov.

  • prvý kontakt s počítačmi na strednej škole - PMD 1,2,3, PP06, Atari, Sinclair (programovanie v jazyku: strojový kód, basic a pascal):  2 roky
  • na VŠ - jazyky Turbo pascal a Turbo C: 1rok
  • programovanie databázového ekonomického širokoškálneho software v Delphi a C++ Borland (databázy Paradox): 8 rokov v Codex s.r.o. Nitra
  • programovanie webových aplikácií na databázach MySQL a MS SQL server: 1 roky na živnosť (firmy: Hermes Nitra, Schindler v Bratislave)
  • pracoval ako DBA v Homecredit Brno a vo VÚB Bratislava ako vyvojár + optimalizácie v SQL a PL/SQL na Oracle 11g (firma Accenture)
  • programoval programy pre súkromné firmy pre HW na skenovanie povrchov nádrží pre skladovanie tekutých palív (pristroj Leica)
  • momentálne pracuje ako DBA pod Oracle 11g a ako vyvojár vnútropodnikových databázových aplikacií v PHP, SQL, C++, C# a interface v PL/SQL: 11 rokov
  • ďalej programuje s HTML, CSS, Ajax, Javascript, VBA, MS visual C++ a C# malé podporné aplikácie
  • certifikát SQL expert for Oracle 11g   
  • spolupracuje a aktívne učí pre počítačové firmy: Lapis, IVIT v Nitre