Új hozzászólás Aktív témák
-
Benmartin
senior tag
válasz Sk8erPeter #1100 üzenetére
Elég általános kérdéseket teszel fel: "Hogyan születik meg a javított kimeneti fájl?" Hát úgy, hogy létrehozod a fájlt, erre mit lehet mondani?
1.) fgets
2.) Egyébként én úgy csinálnám, hogy magát a fájlneveket is kigyűjteném egy fájlba és abból olvasnám be, majd nyitnám meg a fájlokat.
3.) fopen("javitott.txt","w") -
Benmartin
senior tag
válasz Benmartin #1101 üzenetére
De megírtam, hogy ne csak dumáljak itt:
#include <stdio.h>
#define MAX_FAJLNEV_HOSSZ 100
FILE * filelist, * file;
char name[MAX_FAJLNEV_HOSSZ+1], * block;
unsigned int h;
int main()
{
filelist = fopen("filelist.txt","r");
while(!feof(filelist))
{
fscanf(filelist,"%s",name);
file = fopen(name,"r");
fseek (file,0,SEEK_END);
h = ftell(file);
rewind(file);
block = (char *) malloc(h);
fread(block,1,h,file);
block += 4;
fclose(file);
fopen(strcat(name,"_jav.txt"),"w");
fwrite(block,1,h-4,file);
fclose(file);
}
fclose(filelist);
return 0;
} -
doc
nagyúr
válasz Sk8erPeter #1100 üzenetére
ezt kimondottan C-ben akarod megirni, vagy csak a megoldas a fontos?
Linux alatt ez igy nez ki:cat *txt | cut -c 5-
vagy ha kulon txt-kbe kell a vegeredmeny is:
for i in *txt; do cat $i | cut -c 5- >vagott-$i ; done
[ Szerkesztve ]
-
Jester01
veterán
válasz Benmartin #1102 üzenetére
Ajjjaj ilyen rossz példával ne kábítsuk szegény tanulókat
Hirtelen ennyi:1. te nem a sorok elejéről szedted le az első 4 karaktert
2. az fscanf visszatérési értékét célszerű ellenőrizni, nem pedig a feof-ot
3. %s formátummal nem olvasunk fájlneveket (sem) mert megáll a szóközöknél
4. az fscanf-ben nincs hossz limit
5. teljesen felesleges betölteni a memóriába a fájlt
6. strcat-hoz hiányzik a megfelelő #include
7. malloc-hoz hiányzik a megfelelő #include
8. a malloc void*-ot ad vissza, csúnyán néznek azokra akik ezt cast-olják
9. a lefoglalt memóriát nem szabadítod fel
10. a változók globálisak nem lokálisak
11. az ftell nem unsigned int-et ad vissza
12. hibakezelés teljes hiányaJester
-
Benmartin
senior tag
válasz Jester01 #1104 üzenetére
1.) Tényleg elnéztem.
2.) Meglehet, gyakorlatban azonban működik.
3.) Jó, hát általában nem teszünk szóközt a fájlokba.
4.) Azért van a MAX_FAJLNEV_HOSSZ.
5.) Több megoldás is létezik.
6.-7.) ANSI C fordítónak nem is kell.
8.) Csúnyán néznek de működik, mondjuk akár ki is lehet venni.
9.) Ez jogos.
10.) Ebbe fölösleges belekötni.
11.) long-ot, de ebből nem igen lesz probléma.
12.) Nem is akartam hibakezelést írni. (gondolom magának írja) -
Jester01
veterán
válasz Benmartin #1105 üzenetére
Azért kötözködtem, mert tanuláshoz rossz példa.
2. Izé, kipróbáltad? Mert nem működik, mivel a feof csak azután lesz igaz, hogy túlmész a fájl végén. Tehát előfordulhat, hogy eggyel többször fut a ciklusod és az utolsó alkalommal ki tudja milyen adatra. Ehhez csak az kell, hogy az utolsó sor végén is legyen egy soremelés (márpedig ez normális dolog). Egyébként is pl. %d esetén vagy bonyolultabb formátumstringnél abból tudod, hogy sikerült-e beolvasni valamit. ellenkező esetben könnyen végtelen ciklus lehet (ugyanis olyankor a fscanf nem eszi meg a hibás adatot, de feof sem lesz)
3. sajnos de. sőt, még ékezeteket is. sokat szívok ezekkel én is a munkám során, főleg linux-windows közötti másolgatás nagy élmény (meg a kalapos vs. rendes ő/ű)
4. az azért van, hogy annyit kezel a programod, addig ok. de sehol nem biztosítod, hogy ne is legyen több. Az fscanf jelen formájában vidáman megesz többet is és szép buffer overflow lesz belőle. Ezt is jobb idejekorán megtanulni.
5. igen, és ez a rossz. már miért is ne lehetne egy 120GB-os fájlt feldolgozni csak azért mert nincs 120GB memóriám.
6-7. már hogyne kellene. Amelyik függvénynek nincs prototípusa, azt alapból int visszatérési értékkel feltételezi a fordító. Márpedig sem a malloc sem pedig az strcat nem int-tel tér vissza. És ha az int véletlen nem binárisan kompatibilis a void* illetve a char* típusokkal (pl 64 bites rendszer esetén) akkor az instant segfault.
10. szerintem nem fölösleges, jobb ha az újonc azt látja hogy a változókat a lehető legszűkebb körben deklaráljuk
11. azt te honnan tudod? És ha 5GB-os fájlra akarom futtatni? Vagy 128kB-osra 16 bites rendszeren?
12. ja és akkor nem kell. pl ha egy fájl (vagy sor) véletlen nincs 4 karakter akkor a program összeomlása az rendben van?Jester
-
Sk8erPeter
nagyúr
válasz Benmartin #1102 üzenetére
Hali!
Köszi, hogy megírtad, de ez a program igen érdekes dolgokat csinál
A végeredmény az lesz, hogy MINDEN karakter után tesz egy szóközt. Egy fájlnál az összes sortörést is kitörölte (mondjuk nem értem, hogy ezt a másiknál miért nem tette).
Szemléltetésként ilyen lesz: [link] (itt épp php-kódokat másoltam ki pdf-ből, a sorszámozást ki akartam szedni, de ez a lényeg szempontjából tök mindegy)Első lefordításnál ilyen hibát dob:
(már a while(!feof(filelist))-nél baja van)
Gondolom ezért is működik hibásan többek közt...
Aztán már le sem akar fordulni (létrehozni az exe-t), na mindegy, itt valami nagyon nem jó...
De azért thx. Egy javított verzió jól jönne... Előre is köszi!Egyébként az "általános kérdéseket" hajnali fél 5 közeledtével fogalmaztam meg, így simán elképzelhető, hogy hülye kérdést tettem fel...
(#1103) doc: igazából mindkettő... de inkább gyakorolni szeretnék C-ben.
Nem használok Linuxot (egyelőre). Tehát elsősorban a C-s megoldás érdekelne.
Nyilván létezik egyébként olyan külső program (pl. Lupas Rename), amivel lazán megoldható, de abból nem lehet tanulni.(#1104) Jester01: Esetleg tudnál egy javított változatot mutatni?
[ Szerkesztve ]
Sk8erPeter
-
Benmartin
senior tag
válasz Sk8erPeter #1107 üzenetére
Mert különbözik a compilerünk, kipróbáltam mielőtt elküldtem neked.
-
Benmartin
senior tag
válasz Jester01 #1106 üzenetére
2. Igen, kipróbáltam, bizonyára azért működött, mert nem volt '\n' a sor végén.
3. Oké, elfogadom, én nem szoktam, lehet azért írtam így.
4. Ez oké, de nem akartam bele hibakezelést írni, meg overflowokra figyelni, mert az kétszer ennyi kód, jelzésnek viszont ott volt, hogy mire képes.
5. Szerencsére itt nem voltak olyan méretek.
6-7. Ennek ellent kell mondjak rengeteg forráskódot küldtem már programozó versenyekre, ahol oline judge fordít ANSI C fordítóval, és nem igényelte a headereket, tulajdonképpen még az stdio.h-t sem.
10. Ez kérdéses, hogy mikor jó, mikor nem. Ebben a kódban semmi jelentősége nem volt, hogy globálisak a változók, egy másik példában lehet zavart okoz, egy másikban meg lehet, hogy pont úgy célszerű.
11. Valóban nem tudhatom, ha ilyen egyéni igények vannak, akkor lehet változtatásokat eszközölni.
12. Nincs rendben, de mondtam, hogy ennek kivédését nem állt szándékomban megírni. -
Sk8erPeter
nagyúr
válasz Benmartin #1109 üzenetére
"mert nem volt '\n' a sor végén." De itt pont különálló, sortöréssel elválasztott sorokról van szó... bár lehet, hogy félreértelek...
Milyen fordítóval próbáltad? Nálam most Visual Studio 2003 van fent (azért használom ezt egyelőre, mert egyetemen is ezt használják szoftver laboron, nem akarom, hogy a fordító különbözősége miatt ott jelentkezzen egy hiba, amire nem számítok)
Most még mindig csak azt nem tudom, hogyan is kéne akkor megoldani a feladatot, na majd próbálkozom...
Azért kérdeztem egyébként, hogy mivel olvastassam be az adatokat, mert lehetne fscanf(), fgets(), fgetc(), fread(), és még ki tudja, hány függvénnyel is elvégeztetni ezt a feladatot (fgetc nyilván nem jó, meg fscanf sem, asszem annak is van valami szóköz-problémája).
Valami olyasmire gondoltam egyébként, hogy a progi a beolvasáskor az első /n-ig elmegy, eltárol egy sort valamilyen tömbbe vagy akármibe, és ezt úgy adja ki, hogy az 5. karaktertől lesz kiírva. Végül is ha tömbként kezelem, akkor elvileg a 0. elemtől kezdi, akkor elég lenne csak hozzáadni +4-et, hogy kezdje onnan, nem?Sk8erPeter
-
Jester01
veterán
válasz Benmartin #1109 üzenetére
5. Nem, de miért nem írod egyből jóra a programot? Azért, hogy extra pénzt kaszálj majd a professional verzióért ami nagyobb fájlokat is tud kezelni? Igen, lefordul, csak esetleg nem működik. Ráadásul a változó argumentumot használó függvényeknek ansi C szerint is kötelező a prototípus (pl. fscanf, printf) tehát általában az stdio.h bizony nem elhagyható. Az meg, hogy egy adott fordító esetleg mit eszik meg és mit nem, abszolút nem befolyásolja hogy mi van a szabványban vagy hogy mi a helyes.
6-7. melyik részének mondasz ellent? Annak, hogy int a prototípus nélküli függvények visszatérési értéke vagy annak, hogy pl. 64 biten piszkosul megszívod ha int-et használsz pointer helyett?
A többire pedig továbbra is csak azt tudom mondani, hogy lehetőleg ne ezt tanítsd egy kezdőnek.
Jester
-
Jester01
veterán
-
Jester01
veterán
válasz Sk8erPeter #1107 üzenetére
Na itt az én verzióm, hogy ti is kötözködhessetek. Amit még én magamba belekötök, hogy lehetne még:
1. függvényekre szétszedni
2. a hosszú fájlneveket is (láncolt listával) kezelni
3. a tab-okat kezelni
4. locale beállításokat figyelembe venni
5. a kimenő fájlnevet szebben előállítani
6. parancssori argumentumokat kezelniJester
-
cellpeti
veterán
Hogyan tudom kiiratni EOF értékét?Mert ilyen progit kéne megírnom,de ....
[ Szerkesztve ]
Tigris, tigris, csóvafény...
-
426os
őstag
Sziasztok.
Nem tudom ki hallott már a SE és Siemens telefonokon futtatható elfekről. Ezek apró kis programok, amelyek közvetlenül a hardverrel kommunikálnak, tehát elég gyorsan tudnak futni.
Viszont elég kevés elfnek nyilvános a forráskódja, és ennek hiányában nem igazán lehet belenyúlni, gondolok itt a lefordítást más nyelvre. Valamilyen szinten hex editorral ugye át lehet írni a karaktereket benne, de az nem az igazi. Ha jól tudom ezek C-ben vannak írva, tehát remélem jó helyen érdeklődök. Mégpedig afelől, hogy létezik-e olyan program, ami képes visszafejteni a kész, futtatható programot forráskódra. Mellékelek pár elfet (meg 1-2 forráskódot is, amihez nyilvános), csakhogy tudjátok miről beszélek.
[link]
Tudom, hogy az lenne a legegyszerűbb, hogy megkeresném a készítőket és elkérném a kódot, de ez sajnos nem járható út, mivel orosz barátaink nem szívesen adják azt ki.
Előre is köszönöm, ha valaki veszi a fáradtságot és foglalkozik velem.
üdv,
batonyo.
-
gygabor88
tag
Sosem foglalkoztam telefonokkal, de ha egy forráskódból futtatható binárist készítesz, akkor abból nem kapható vissza az eredeti forráskód. Az azonosítókat nem fordítják bele, így pl változóneveket, függvényneveket biztos nem lehet visszahozni. Ha van a telefonokra valami assembly szerű nyelv, akkor ilyen assembly utasításokra valószínűleg vissza lehet fejteni.
-
cellpeti
veterán
Sziasztok!
Van nekem egy olyan feladatom,hogy a bemeneti szöveget úgy kell átmásolni a kimenetre,hogy a közben előforduló tabulátorkaraktereket \t,a visszaléptetés \b és a fordított törtvonal(backslash) karaktereket \\ karakterekkel helyettesíti.
Na én elkezdtem ezt a progit,de \\ helyet csak \ rak,ez valszeg a putchar miatt van,valszeg nem ezt kell használni. Megpróbáltam printf-vel is,de ott se jutottam előrébb. Lehet az egész rossz,ahogy elkezdtem,ezért ha valaki tud adjon tanácsot,megkösszönném.
a kód:
#include<stdio.h>
void main(void) {
int c;
c = getchar();
while(c!=EOF)
{
if (c=='\t') putchar('\\');
if (c=='\b') putchar('\\');
if (c=='/') putchar('\\');
else putchar(c);
c=getchar();
}
}Esetleg egy darab if-ben nem lehetne megoldani a dolgot?
[ Szerkesztve ]
Tigris, tigris, csóvafény...
-
SLD
tag
válasz cellpeti #1118 üzenetére
Ez nem gond, a \ jellel aktiválod, az őt követő karakter "különleges értelmezését", ami legtöbbször egy formázó karakter. Szóval az első \-el aktiváltad ezt, így a második \ megjelent (itt saját maga esetén persze nem aktiválod vele, hanem tulajdonképpen deaktiválod, de ez már csak részletkérdés), ha ebből Neked két darabot kell kiíratnod, akkor \\\\ -t (4x) kell írnod.
Szerk: No persze, ha a putchar, csak egy char-t tud kezelni akkor az lehet gond lesz, mert két \ már két karakter, várunk egy C -s kollegát
A kódhoz, C++-os lévén, inkább nem szólok hozzá, de ha már kiírt egy \-t akkor nagy baj nem lehet.
[ Szerkesztve ]
-
cellpeti
veterán
-
cellpeti
veterán
Valaki tudna ebben segíteni?
Tigris, tigris, csóvafény...
-
PazsitZ
addikt
válasz cellpeti #1121 üzenetére
Én így csinálnám:
#include<stdio.h>
int main() {
int c;
c = getchar();
while(c!=EOF)
{
if (c=='\t') printf("\\\\");
if (c=='\b') printf("\\\\");
if (c=='/') printf("\\\\");
else putchar(c);
c=getchar();
}
return 0;
}De nem biztos, hogy a legjobb megoldás, régen c-ztem.
[ Szerkesztve ]
- http://pazsitz.hu -
-
cousin333
addikt
válasz cellpeti #1124 üzenetére
Visszatérési érték, hogy minden frankón lefutott.
A "\" meg az escape karakter, aminek speciális jelentése van (pl. a "\n" jelzi a sortörést), éppen ezért nem lehet csak úgy magában leírni, hanem duplázni kell, jelezve, hogy kivételesen tényleg egy "\"-re vágysz.
[ Szerkesztve ]
"We spared no expense"
-
Sk8erPeter
nagyúr
válasz Jester01 #1113 üzenetére
Bocsi, hogy csak most válaszolok, nem nagyon voltam gépközelben!
Köszönöm, hogy megírtad, ez nagyon faszán működik!
Pár rövid pluszkérdés:
1.) Ami érdekességet (számomra érdekes) felfedeztem, hogy ha sima Notepad-del, Unicode kódolással mentek egy fájlt, akkor nem működik a program, és egy 0 bájtos verziót készít el, míg az ANSI kódolásúakkal nincs probléma. Ez mitől van?
(Ha Notepad++-szal készítem el ugyanazt a fájlt, amiért a sima Notepad pampog, hogy elveszhetnek egyes karakterek, ha nem Unicode-ban mentem, akkor semmi para. Gondolom alapvetően a Notepad++ ANSI kódolással készíti el a fájlt, nem?)
2.) A "const int column" miért fontos, hogy const legyen?
3.) A "char infilename[MAX_FILENAME_LENGTH + 1];" sornál miért kell a +1?
4.) Ugyanígy ott van a plusz 1 a "char outfilename[MAX_FILENAME_LENGTH + 9]; /* a +8 a _jav.txt miatt */" sorban.
5.) A többin még gondolkozom...Még egyszer köszönöm, hogy megírtad!
Sk8erPeter
-
skylaner
senior tag
válasz Sk8erPeter #1133 üzenetére
3-4
Mert a C automatikusan a string végére tesz egy '\0'-t, így tudja, h vége annak a stringnek.
Így n hosszú strignek n+1 nagyságú tömb kell.
Amikor pl te ezt írod,hogy: char a[]="abc" akkor a fordító automatikusan lefoglal +1 helyet még a \0-nak.char a[]="abc";
char b[]={'a','b','c','\0'};
printf("%d\n",sizeof(a)); // 4byte
printf("%d\n",sizeof(b)); // 4byte -
Jester01
veterán
válasz Sk8erPeter #1133 üzenetére
1. azért mert unicode (akár utf8 akár utf16/ucs2) esetén nem 1 byte 1 karakter. Utf16 esetén továbbá sok 0 byte is előfordul ami C-ben sajnos a string végét jelzi.
2. nem fontos, de ha egyszer konstans, akkor miért ne
3-4. lásd a kollega válaszát fentebb
5. jóJester
-
skylaner
senior tag
Nekem is lenne egy kérdésem.
Kb. 1,5 éve nem foglalkoztam a C-vel, elvileg számgép-háló 2-n ebbe fogunk programozni, így
az a gondolatom támadt, hogy nem ártana átnézni a dolgokatNa szóval lenne nekem egy bináris keresőfás programocskám, ami működik is, annyi lenne a kérdésem, h az alábbi fgv valóban felszabadítja-e a lefoglalt memóriát. Jó ez így, vagy máshogy kellene csinálni ?
typedef struct fa{
int ID;
struct fa* left;
struct fa* right;
} Fa;
........
void felszabadit(Fa* myFa)
{
if(!myFa) return;
felszabadit(myFa->left);
felszabadit(myFa->right);
free(myFa);
}
int main() {
Fa* myFa=NULL;
.........................
felszabadit(myFa);
myFa=NULL;
return 0;
}Vagy esetleg magának a pointernek a címet kellene átadni, felszabadit(&myFa) és akkor void felszabadit(Fa** myFa) ......?
[ Szerkesztve ]
-
cellpeti
veterán
Sziasztok!
Nekem van egy feladatom,de nem teljesen értem.
Írjunk programot,ami a bemenetre adott szöveget úgy másoljuk át a kimenetre,hogy közben az egy vagy több szóközből álló karaktersorozatokat egyetlen szóközzel helyettesíti!Mi a feladat végülis?
Tigris, tigris, csóvafény...
-
cellpeti
veterán
Sziasztok!
Csillaggal már sikerült megírnom a programot,viszont szóközzel még nem igazán.
Arra gondoltam,hogy lehet az ASCII kódjával kéne próbálkozni. Tudja valaki a szóköz ASCII kódját?Tigris, tigris, csóvafény...
-
skylaner
senior tag
-
skylaner
senior tag
válasz cellpeti #1145 üzenetére
Én így csináltam, de szerintem egyáltalán nem bonyolult.
int main(){
char a[255], b[255];
int i=0,space=0,j=0,hossz;
printf("Bemenet:");
gets(a);
hossz=strlen(a);
for(i=0;i<hossz;i++) {
if(a[i]==' ') space++;
if(a[i]!=' '){
b[j]=a[i];
space=0;
j++;
}
if(space==1){
b[j]=a[i];
j++;
}
}
b[j]='\0';
printf("Kimenet:%s\n",b);
getch();
return 0;
}Aztán biztos van egyszerűbb megoldás is,de elsőre ez jutott eszembe.(Mondjuk Perl-be egy sor lenne az egész )
[ Szerkesztve ]
-
Jester01
veterán
válasz skylaner #1148 üzenetére
Viszont nincs benne hossz korlátozás ezért használata erősen ellenjavalt (buffer overrun). Helyette általában az fgets ajánlott, de vigyázat, az viszont eltárolja a sorvég jelet is. Jelen esetben azonban teljesen felesleges sorokat olvasni, mivel a feladat karakter-orientált.
Jester
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Kerékpárosok, bringások ide!
- Ukrajnai háború
- Elektromos rásegítésű kerékpárok
- OFF TOPIC 44 - Te mondd, hogy offtopic, a te hangod mélyebb!
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Windows Insider Program
- Kupon kunyeráló
- Anime filmek és sorozatok
- Frissült a MediaTek középkategóriás ajánlata
- ASUS routerek
- További aktív témák...