[ Pharos @ 27.04.2006. 19:08 ] @
Nikad ovo nisam znao da uradim u C-u :)
Potrebno je napraviti program koji će da pročita txt fajl koji ima oko 100.000 redova.
Da na početku svakog reda stavi n1, n2, n3... i da to snimi kao drugi fajl.
Ako imam

fajl1.txt
Code:

neki tekst
neki tekst
neki tekst
...


fajl2.txt treba da izgleda
Code:

n 1. neki tekst
n 2. neki tekst
n 3. neki tekst
...


Dal' postoji neko koga ne mrzi da okači ceo kod?

Hvala!
[ WEXY @ 27.04.2006. 19:53 ] @
Code:
#include <stdio.h>

#define MAX_LENGHT 2048

int main (int argc, char* argv[])
{
    FILE* input;
    FILE* output;
    char temp_line[MAX_LENGHT];
    unsigned long i = 1;
    
    if (argc < 3)
    {
        printf ("Usage: evt-pharos.exe input_filename output_filename\n");
        return 0;
    }
    
    if ((input = fopen (argv[1], "r")) == NULL)
    {
        printf ("Error opening input file %s.", argv[1]);
        return 1;
    }
    
    if ((output = fopen (argv[2], "w")) == NULL)
    {
        printf ("Error opening output file %s.", argv[2]);
        return 1;
    }
    
    while (!(feof (input)))
    {
        fgets (temp_line, MAX_LENGHT, input);
        fprintf (output, "n %d. %s\n", i++, temp_line);
    }
    
    printf ("Done.\n");

    return 0;
}
[ Pharos @ 27.04.2006. 20:17 ] @
Hvala ti puno.
Jedino što ne treba da se stavlja \n između redova, ali ispravio sam to.
pOz
[ Pharos @ 28.04.2006. 01:44 ] @
Malo sam prepravio tvoj kod. Ipak je ovo C++ forum :D
Code:

#include <iostream>
using namespace std;

#define MAX_LINE_LENGHT 2048
#define MAX_NUM_LENGTH 50
int main(int argc, char* argv[])
{

    FILE* input;
    FILE* output;
    char temp_line[MAX_LINE_LENGHT];
    char temp_string[MAX_LINE_LENGHT];
    char num_buffer[MAX_NUM_LENGTH];
    
    if(argc<3)
    {
        cout << "Usage: app_name.exe input_filename output_filename" << endl;
        return 1;
    }
    if(!(input=fopen(argv[1],"r")))
    {
        cout << "Error opening input file " << argv[1] << endl;
        return 2;
    }
    if(!(output=fopen(argv[2],"w")))
    {
        cout << "Error opening output file " << argv[2] << endl;
        return 3;
    }
    
    while(!(feof(input)))
    {
        static unsigned long i = 0;
        strcpy(temp_string,"n ");
        itoa(++i,num_buffer,10);
        strcat(temp_string,num_buffer);
        strcat(temp_string,". ");
        fgets (temp_line, MAX_LINE_LENGHT, input);
        strcat(temp_string,temp_line);
        fputs(temp_string,output);
    }

    fclose(output); fclose(input);
    cout << "Done." << endl;

    return 0;
}

Zanima me da li može da se optimizuje ovaj kod.
Mnogo mi je to koda.
U Perl-u je mnogo manje :)
Hvala!


[Ovu poruku je menjao Pharos dana 28.04.2006. u 02:51 GMT+1]
[ WEXY @ 28.04.2006. 02:19 ] @
Citat:
#1130408/Pharos: Nikad ovo nisam znao da uradim u C-u :)
...


Pitao si za C, a i opet nije skroz C++ :)

Sad mi je kasno da kucam, postaviću sutra rešenje.
[ WEXY @ 28.04.2006. 17:35 ] @
Code:
#include <iostream>
#include <fstream>

using namespace std;

const int MAX_LENGHT = 2048;

int main (int argc, char* argv[])
{
    if (argc < 3)
    {
        cout << "Usage: evt-pharos-cpp.exe input_filename output_filename." << endl;
        return 0;
    }

    ifstream input;
    input.open (argv[1]);

    if (!input.is_open ())
    {
        cout << "Error opening file `" << argv[1] << "' for input!" << endl;
        return 1;
    }

    ofstream output;
    output.open (argv[2]);

    if (!output.is_open ())
    {
        cout << "Error opening file `" << argv[2] << "' for output!" << endl;
        return 1;
    }

    char* temp_line = new char [MAX_LENGHT + 1];
    long i = 1;

    while (!input.eof ())
    {
        input.getline (temp_line, MAX_LENGHT);
        output << "n " << i++ << ". " << temp_line << endl;
        
        temp_line[0] = 0;
    }

    delete [] temp_line;

    input.close ();
    output.close ();

    cout << "Done." << endl;

    return 0;
}


[Ovu poruku je menjao WEXY dana 28.04.2006. u 18:37 GMT+1]
[ Pharos @ 28.04.2006. 18:48 ] @
Svaka čast!
[ Function @ 29.04.2006. 11:14 ] @
A zašto ne koristite string klasu mjesto char*?
[ pcaca @ 29.04.2006. 16:13 ] @
Citat:
#1132294/Function: A zašto ne koristite string klasu mjesto char*?

I ja mislim da je karakterni niz naslegjen iz C-a. U C++ koriste se stringovi.
Code:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main (int argc, char* argv[])
{
    if (argc < 3) {
        cout << "Usage: " << argv[0] << " input_filename output_filename." << endl;
        return 0;
    }

    ifstream input(argv[1]);

    if (!input) {
        cout << "Error opening file \"" << argv[1] << "\" for input!" << endl;
        return 1;
    }

    ofstream output(argv[2]);

    if (!output) {
        cout << "Error opening file \"" << argv[2] << "\" for output!" << endl;
        return 1;
    }

    string temp_line;
    unsigned long i = 1;

    while (getline (input, temp_line))
        output << "n " << i++ << ". " << temp_line << endl;

    input.close ();
    output.close ();

    cout << "Done." << endl;

    return 0;
}

Ovo je nesto kraci kod.

PS: Mozda je moguce da se uradi neshto i sa "stream iteratorima" ali sada nemam dovolno vremena da testiram.

[Ovu poruku je menjao pcaca dana 29.04.2006. u 17:13 GMT+1]
[ leka @ 04.05.2006. 09:23 ] @
Ne mora da znaci da je kod vise C++ ako covek korist iostream, a da NIJE C++ ako koristi STDC pozive... Za ovako trivijalan program je prvo wexy-jevo resenje najbolje. Evo uzmite sami pa uporedite C i C++ verziju... C++ verzija je 2x veca, sa gomilom bezveznih << i >> . Okej, ja volim C++, ali ne mora se uvek pristupiti resavanju problema na C++, objektno orjentisan nacin. No, to je licno misljenje...
[ DjoleReject @ 08.05.2006. 23:33 ] @
Zar je i jedan dati primer imao i jednu osobinu OOP-a. U ovim slucajevima smo samo imali razlicite jezike, koristene na isti (proceduralan)nacin. Ali izgleda da je univerzalno pravilo - ako zelite manji fajl, bolje je da inkludujete stdio.h nego iostream.

[Ovu poruku je menjao DjoleReject dana 09.05.2006. u 00:34 GMT+1]