Skocz do zawartości
s0n1c

[c] Program Odczytujace Dane Z Pliku.

Rekomendowane odpowiedzi

Witam, mam problem z napisaniem programu wykonuajcy problem zawarty w temacie.

Rasumujac probuje napisac program (wsumie moze to byc funkcja void) ktory:

Odczytujac takie dane z pliku tekstowego:

Assume 23.9761,567,111.1111568,1233,40.00001234,2692,29.96652693,2693,23.80952694,2695,30.30302696,2934,23.97432935,2935,111.11112936,2936,30.30302937,14107,23.9730
Wygeneruje plik z taka zawartoscia:

input = DirectShowSource("video.avi")output = input.trim(1,567).assumefps(111.1111).changefps(23.976)output = output + input.trim(568,1233).assumefps(40.0000).changefps(23.976)output = output + input.trim(1234,2692).assumefps(29.9665).changefps(23.976)output = output + input.trim(2693,2693).assumefps(23.8095).changefps(23.976)output = output + input.trim(2694,2695).assumefps(30.3030).changefps(23.976)output = output + input.trim(2696,2934).assumefps(23.9743).changefps(23.976)output = output + input.trim(2935,2935).assumefps(111.1111).changefps(23.976)output = output + input.trim(2936,2936).assumefps(30.3030).changefps(23.976)output = output + input.trim(2937,14107).assumefps(23.9730).changefps(23.976)output = output + input.trim(14108,0).changefps(23.976)return output

Ponizej umieszczam moje przemyslenia jak to zrobic.

===================

Main

 

Jakies zmienne.

 

otwieramy plik wejsciowy (tryb do odczytu)

tworzymy plik wyjsciowy (tryb do zapisu)

 

zapisujemy do pliku wy linijke

"input = DirectShowSource("video.avi")"

 

odczytujemy plik we po znaku, az do konca.

Jesli natrafisz na znak spacji, zapisuj zawartosc pod zmienna "fps" az do napotkania znaku nowej linii ('\13' czy jakos tak).

Teraz:

Zapisuj kazdy znak do buforu, jesli natrafisz na "," zapisz zawartosc buforu do zmiennej "x", wyczysc bufor

Zapisuj kazdy znak do buforu, jesli natrafisz na "," zapisz zawartosc buforu do zmiennej "y", wyczysc bufor

Zapisuj kazdy znak do buforu, jesli natrafisz na koniec linii, zapisz zawartosc buforu do zmiennej "z", wyczysc bufor, zapisz linie do pliku wyj w postaci:

"output = input.trim(x,y).assumefps(z).changefps(fps)"

Analogiczne postepowanie, tylko dalsze linijki zapisuje w postaci:

"output = output + input.trim(x,y).assumefps(z).changefps(fps)"

Jesli natrafisz na koniec pliku, dopisz linijke w postaci:

output = output + input.trim(y,0).changefps(fps)

return output

===================

 

No i tutaj zaczyna sie problem. jak to teraz przedstawic w postaci kodu :rolleyes: .

Co mam? Prawie nic.

int main(int argc, char* argv[]){	int getch(void),licznik; <- licznika bym uzlyl zeby rozpoznac czy ma zapisac output + input.trim czy samo input.trim	char buffer;		FILE* plikWe=fopen("c:\\test.txt","rt"); //zamiast "c:\\test.txt" chyba lepiej dac argv[].		FILE* plikWy=fopen("c:\\test2.txt","wt");		fprintf(plikWy, "input = DirectShowSource("video.avi")"); <-bledna linijka, ale jak cytowac cytat?		while( fread(&buffer,1,1,plikwe) )		 {		  if(buffer==' ');		  //I tutaj wiedza sie konczy		 }		fclose(plikWy);		fclose(plikWe);	getch();	return 0;}
Jak widac, niewiele tego.

Moglby ktos pomoc jak rozwiazac problem? Nakierowac na przydatne funkcje.

Mysle, ze zamiast "while( fread(&buffer,1,1,plikwe) )" lepsza bedzie funkcja scanf czy jakie tam sa.

Z gory thx.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pozamieniaj "," na spacje w pliku wejściowym i śmiało:

 

FILE *inp;FILE *out;char path_in[] = {"in.txt\0"};char path_out[] = {"out.txt\0"};int x, y, z;inp = fopen(path_in, "r");out = fopen(path_out, "w");//w pętli fscanf(inp, "%d %d %d", &x, &y, &z);fprintf(out, "%d %d %d", x, y, z);
Edytowane przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Thx za funkcje.

Po tym problem okazal sie banalny.

Teraz mam pytanie, czy kod da sie jakos uproscic?

I jak przerobic calosc do postaci funkcji, ktora wywolana (bez parametorw itp) wykona po prostu swoja robote? (bo mam z tym problemy :rolleyes: )

» Naciśnij, żeby pokazać/ukryć tekst oznaczony jako spoiler... «

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#pragma hdrstop//---------------------------------------------------------------------------#pragma argsusedint main(int argc, char* argv[]){	int getch(void), pozycja=0, liczniklini=0;	char buffer, tab[20], liczba=0, framepersec=0, zmienne=0;	unsigned int x=0, y=0;	float z=0, fps=0;	FILE* plikWe=fopen("c:\\test.txt","r");	FILE* plikWy=fopen("c:\\timecode.avs","w");	if(plikWe==NULL)		{			printf("Blad odczytu pliku wejsciowego!");			getch();			return 0;		}	while( fread(&buffer,1,1,plikWe) )	{		if( isdigit(buffer) || (buffer=='.') )		{			tab[pozycja++] = buffer;			if (framepersec==0)			{				fps = atof (tab);				continue;			}			if (zmienne==1)				{				if(liczba==0)				{					x = atol (tab);					continue;				}				if(liczba==1)				{					y = atol (tab);					continue;				}				if(liczba==2)				{					z = atof (tab);					continue;				}			}		}		if(buffer==',')		{			liczba++;			pozycja = 0;			memset(tab,'\0',20);			continue;		}		if(buffer=='\n')		{			framepersec = 1;			zmienne = 1;			pozycja = 0;			liczba = 0;			memset(tab,'\0',20);						if(liczniklini==1)			{				fprintf(plikWy, "input = DirectShowSource(\"video.avi\")\n");				fprintf(plikWy, "output = input.trim(%d,%d).assumefps(%.4f).changefps(%.4f)\n",x,y,z,fps);			}			else if(liczniklini>=2)			{				fprintf(plikWy, "output = output + input.trim(%d,%d).assumefps(%.4f).changefps(%.4f)\n",x,y,z,fps);			}			liczniklini++;		}	}	if(liczniklini==1)	{		printf("Film nie zawiera zmiennego fps.\nJego stala wartosc wynosi: %.3f",z);	}	else if(liczniklini>=2)	{		fprintf(plikWy, "output = output + input.trim(%d,%d).assumefps(%.4f).changefps(%.4f)\n",x,y,z,fps);		fprintf(plikWy, "output = output + input.trim(%d,0).changefps(%.4f)\n",y,fps);		fprintf(plikWy, "return output");	}		fclose(plikWy);	fclose(plikWe);	getch();	return 0;}
Edytowane przez s0n1c

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dlaczego bez parametrów :) W gruncie rzeczy funkcja bez parametrów nie jest do końca funkcją w matematycznym aspekcie.

 

mozna uproscic wizualnie usuwając zbędne klamry w ifach w których jest 1 polecenie.

 

Zastosowanie funkcji ma zazwyczaj sens gdy w grę wchodzi ponowne użycie jakiegoś kodu. Zwiększa tez czytelność kodu. Jeśli chcesz programować to bez funkcji się nie obejdziesz - z czym masz problemy zatem?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak zadeklarowac ta funkcje. Powiedzmy, ze chce z calego maina zrobic funkcje ktora bedzie pobierac plik test.txt a bedzie zwracac plik timecode.avs.

 

? time2mkv (?)

 

Nie wiem co dokladnie wsadzic w znaki zapytania.

 

Niestety nie jest to ksiazkowy przyklad w stylu:

void tekst (int ilosc){ int i;  for (i=0; i<ilosc; i++) {  printf("linijka tekstu i numerek %d\n",i);  }}main(){teskt(5);return 0;}

A mysle ze funkcja poprawi czytelnosc, bo jeszcze czeka mnie dodanie przekazania argumentu z mojej aplikacji do innej dodawajac jeszcze 2 inne, ta aplikaca zwraca plik txt, no i ten plik txt jest obrabiany przez wczesniej napisany kod.

Rasumujac MKV->AVS :razz:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

zrob sobie, aby program pobieral nazwe pliku do przerobienia jako parametr przy uruchamianiu, bedzie prosciej korzystac z tego potem.

 

no i:

 

void time2mkv()

{

....

}

 

int main()

{

time2mkv();

return 0;

}

 

ale tak jak PelzaK napisal, to troche nie ma sensu :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

niewiem co to uprości, skoro i tak cały kod będziesz miał tylko ze winnej funkcji :)

 

Jeśli chodzi o funkcje, to z przodu podajesz typ zwracany z funkcji\, w nawiasach parametry jej wywołania - czyli to co chcesz przekazać do funkcji. Wynika to z faktu, iż zmienne zdefiniowane w main() czy jakiejś innej funkcji są widoczne tylko w tej funkcji (dokładniej mówiąc pomiędzy klamarami, bo klamry wyznaczają zakres działania zmiennych (tzw scope) ).

Jeśli twoja funkcja nie zwraca żadnych wartości do dajesz po prostu void (nic). Jeśli jest zależna od czegoś co ją wywołuje to dajesz jej odpowiednie parametry.

 

Jeśli chcesz przenieść caly kod main do funkcji to ma to sens jedynie wtedy gdy ta aplikacją bedzie coś jeszcze robić prócz konwersji. a jak ona ma zrobic tylko to co w mainie to można sobie podarować robienie funkcji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Koniec jest coraz blizszy.

Potrzebuje tylko funkcje ktora wywola pewna aplikacje z 3 parametrami (1 parametr, to 1szy parametr funckji main).

 

A dokladniej, jest program co sie odpala z 3 parametrami:

 

program.exe plik1.mkv plik2.avi plik3.txt

 

Dziala w ten sposob, ze otwiera plik1 i po przetworzeniu zwraca plik2 i 3.

 

I teraz chce zeby argument mojej apliakcji byl wysylany do tego programu jako jego 1szy parametr, pozostale 2 moga byc

podane na sztywno, ale duzo lepiej by bylo, jesli by wskazywaly ten sam folder w ktorym znajduje sie plik z 1 parametru.

 

Mam andzieje ze jakos wytluamczylem ocb.

 

Narazie skupmy sie na odpalaniu programu. (od czegos trzeba zaczac)

O ile w c++ dla przykladu jest taki kod:

Process^ odpalProg= gcnew Process();odpalProg->Start("jakis.exe");

To jaka funkcja wykonuje to w C?

No i jak zmyslnie rozwaizac w/w problem.

(Juz pomijam sprawdzanie czy podawany parametr do mojej aplikacji wskazuje na plik.mkv, zajmie sie tym ta 2 aplikacja wywalajac usage)

Edytowane przez s0n1c

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Narazie skupmy sie na odpalaniu programu. (od czegos trzeba zaczac)

O ile w c++ dla przykladu jest taki kod:

Process^ odpalProg= gcnew Process();odpalProg->Start("jakis.exe");

To jaka funkcja wykonuje to w C?

No i jak zmyslnie rozwaizac w/w problem.

Po pierwsze primo, to nie jest C++ co podałeś a C++/CLI - microsoftowy C++ z zarządzaniem pamięcią a sama klasa Process pochodzi z .NETa.

 

W C, C++, C++/CLI, pascal, delphi, jest to obojętne, nie ma polecenia które odpala jakiś program. Aby to zrobić musisz wywołać funkcję systemu operacyjnego (bo to system uruchamia aplikacje a nie Twój program). Funkcja ta znajduje się w tzw Win32Api - jest to zbiór funkcji systemu operacyjnego jakie możesz wywołać ze swojego programu. Do uruchamiania aplikacji służy funkcja ShellExecute()

 

Tu masz dokładny opis tej funkcji: http://msdn2.microsoft.com/en-us/library/ms647732.aspx

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No ok, wyczailem sobie ta funkcje (sytem i createprocess tez), ale mam problem z parametrami. A dokladniej nie wiem jak wsadzic zawartosc argv[1] jako parametr.

 

Umie podac wszystkie na sztywno albo tylko sam argv[1].

A jak pogodzic to ze soba?

jakisprog.exe argv[1] kolejny kolejny2

 

SHELLEXECUTEINFO ShExecInfo = {0};ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShExecInfo.hwnd = NULL;ShExecInfo.lpVerb = NULL;ShExecInfo.lpFile = "exe.exe";ShExecInfo.lpParameters = ""; // i tutaj albo moge podac = argv[1]; albo = "parametr1 parametr2...";przydalo by sie jakies formatowanie w stylu ("%s parametr2 parametr3",argv[1]);ShExecInfo.lpDirectory = NULL;ShExecInfo.nShow = SW_SHOW;ShExecInfo.hInstApp = NULL;	ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...