[C] Problem z wczytywaniem(zapisywaniem) z(do) pliku

Witam,

mam kilka problemów. Nie będę wchodził w szczegóły, co ma robić mój program - skróciłem go do potrzebnych mi do poprawienia rzeczy.

No więc chodzi o to, że jeśli plik wejściowy składa się ze zwykłego tekstu, to wszystko śmiga. Problem się pojawia, jeśli w pliku tekstowym pojawia się przejście do następnej linii, czyli enter, czyli \n

Wejście wej.txt:

Witam Cię, cześć i czołem. No hej. Lubię placki.

Wyjście wyj.txt:

Witam Cię, cześć i czołem. No hej. Lubię placki.

Wszystko OK.

Teraz:

Wejście wej.txt:

Witam Cię, cześć i czołem.

No hej.

Lubię placki.

Wyjście wyj.txt:

Lubię placki.

Czyli wypisuje mi tylko ciąg po ostatnim enterze.

Drugi problem: niepoprawnie działa mi wczytywanie z klawiatury.

Wejście z klawiatury:

Dzien dobry, witam Pana

Wyjście wyj.txt (na ekran to samo):

Dzien

Czyli wypisuje mi do pierwszej spacji (a konkretniej pewnie, do pierwszego białego znaku).

#include 

#include 

#define SIZE 1000

void wypisz(char wsk1[],char wsk2[])

{

    printf("\nF1 - Wczytywanie z pliku (jesli wylaczone -> wczytywanie z klawiatury) %s\n",wsk1);

    printf("\nF2 - Zapisywanie do pliku (jesli wylaczone -> zapisywanie na ekran) %s\n",wsk2);

    printf("\nF12 - ZAPISZ\n");

}

int main()

{

    int dlugosc=0;

    int i;

    char zdanie[SIZE];

    for(i=0; i
        zdanie[i]=' ';

    char on[]="ON";

    char off[]="OFF";

    char wsk1[10],wsk2[10];

    strcpy(wsk1,off);

    strcpy(wsk2,off);

    wypisz(wsk1,wsk2);

    while(1)

    {

        if(GetAsyncKeyState(VK_F1))

        {

            if(strcmp(wsk1,off)==0)

                strcpy(wsk1,on);

            else

                strcpy(wsk1,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F2))

        {

            if(strcmp(wsk2,off)==0)

                strcpy(wsk2,on);

            else

                strcpy(wsk2,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F12))

        {

            break;

        }

        Sleep(200);

    }

    if(strcmp(wsk1,on)==0)

    {

        FILE *f=fopen("wej.txt","r");

        while(!feof(f))

        {

            fgets(zdanie,SIZE,f);

        }

        fclose(f);

        dlugosc=strlen(zdanie);

    }

    if(strcmp(wsk1,off)==0)

    {

        i=0;

        scanf("%s",&zdanie[i]);

        i++;

        dlugosc=strlen(zdanie);

    }

    if(strcmp(wsk2,on)==0)

    {

        FILE *fp;

        fp=fopen("wyj.txt", "w");

        for(i=0; i
            fprintf (fp, "%c", zdanie[i]);

        fclose (fp);

    }

    if(strcmp(wsk2,off)==0)

    {

        for(i=0; i
            printf("%c",zdanie[i]);

        printf("\n");

        system("pause");

    }

    return 0;

}

Program działa tak a nie inaczej, bo tak działa fgets: http://www.cplusplus.com/reference/clib … dio/fgets/ i scanf: http://www.cplusplus.com/reference/clib … dio/scanf/

No dobra, przerobiłem to:

#include 

#include 

#define SIZE 1000

void wypisz(char wsk1[],char wsk2[])

{

    printf("\nF1 - Wczytywanie z pliku %s\n",wsk1);

    printf("\nF2 - Zapisywanie do pliku %s\n",wsk2);

    printf("\nF12 - ZAPISZ\n");

}

int main()

{

    int dlugosc=0;

    int i;

    char zdanie[SIZE];

    for(i=0; i
        zdanie[i]=' ';

    char on[]="ON";

    char off[]="OFF";

    char wsk1[10],wsk2[10];

    strcpy(wsk1,off);

    strcpy(wsk2,off);

    wypisz(wsk1,wsk2);

    while(1)

    {

        if(GetAsyncKeyState(VK_F1))

        {

            if(strcmp(wsk1,off)==0)

                strcpy(wsk1,on);

            else

                strcpy(wsk1,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F2))

        {

            if(strcmp(wsk2,off)==0)

                strcpy(wsk2,on);

            else

                strcpy(wsk2,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F12))

        {

            break;

        }

        Sleep(200);

    }

    if(strcmp(wsk1,on)==0)

    {

        FILE *f=fopen("wej.txt","r");

        for (i=0; i
        {

            fscanf(f,"%c",&zdanie[i]);

        }

        fclose(f);

        dlugosc=strlen(zdanie);

    }

    if(strcmp(wsk1,off)==0)

    {

        i=0;

        scanf("%s",&zdanie[i]);

        i++;

        dlugosc=strlen(zdanie);

    }

    if(strcmp(wsk2,on)==0)

    {

        FILE *fp;

        fp=fopen("wyj.txt", "w");

        for(i=0; i
            fprintf (fp, "%c", zdanie[i]);

        fclose (fp);

    }

    if(strcmp(wsk2,off)==0)

    {

        for(i=0; i
            printf("%c",zdanie[i]);

        printf("\n");

        system("pause");

    }

    return 0;

}

Coś niby poszło do przodu, bo teraz wczytywane jest wszystko z pliku, z jednym mały ale - plik jest automatycznie przedłużany do tej wielkości SIZE, czyli do 1000 (a konkretniej do 1002) i w puste miejsca, już za tym moim tekstem wstawia spacje.

Help.

Jeśli chcesz przepisywać pliki być może lepiej jest użyć fgetc / fputc albo fread / fwrite.

Jeśli chcesz wczytać coś o nieznanym rozmiarze raczej musisz użyć dynamicznej alokacji pamięci (chyba, że będziesz na bieżąco przetwarzał wczytywane dane).

Tu chodzi bardziej o edycję pliku - tj. wczytuję jakiś plik z tekstem, który ma np. 250 znaków. Następnie program przeprowadza jakąś tam edycję tego tekstu i ostatecznie plik ma powiedzmy 289 znaków.

Jeśli chcesz wczytywać linię po linii i jej długość maksymalna nie jest z góry znana to raczej musisz napisać własną funkcję do tego (o ile dobrze pamiętam nie ma wbudowanej o takiej funkcjonalności). Ale to nie problem znaleźć jakieś gotowe rozwiązanie np. tu http://www.google.com/codesearch .

Dobra, coś niecoś napisałem:

#include 

#include 

#define SIZE 1000

int litery(char ciag[])

{

    int t=1;

    int i;

    for(i=0; i
    {

        if(ciag[i]==' ' && ciag[i+1]==' ')

        {

            t=i;

            break;

        }

    }

}

void wypisz(char wsk1[],char wsk2[])

{

    printf("\nF1 - Wczytywanie z pliku %s\n",wsk1);

    printf("\nF2 - Zapisywanie do pliku %s\n",wsk2);

    printf("\nF12 - ZAPISZ\n");

}

int main()

{

    int dlugosc=0;

    int i;

    char zdanie[SIZE];

    for(i=0; i
        zdanie[i]=' ';

    char on[]="ON";

    char off[]="OFF";

    char wsk1[10],wsk2[10];

    strcpy(wsk1,off);

    strcpy(wsk2,off);

    wypisz(wsk1,wsk2);

    while(1)

    {

        if(GetAsyncKeyState(VK_F1))

        {

            if(strcmp(wsk1,off)==0)

                strcpy(wsk1,on);

            else

                strcpy(wsk1,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F2))

        {

            if(strcmp(wsk2,off)==0)

                strcpy(wsk2,on);

            else

                strcpy(wsk2,off);

            wypisz(wsk1,wsk2);

        }

        if(GetAsyncKeyState(VK_F12))

        {

            break;

        }

        Sleep(200);

    }

    if(strcmp(wsk1,on)==0)

    {

        FILE *f=fopen("wej.txt","r");

        for (i=0; i
        {

            fscanf(f,"%c",&zdanie[i]);

        }

        fclose(f);

        dlugosc=litery(zdanie);

    }

    if(strcmp(wsk1,off)==0)

    {

        i=0;

        scanf("%s",&zdanie[i]);

        i++;

        dlugosc=strlen(zdanie);

    }

    if(strcmp(wsk2,on)==0)

    {

        FILE *fp;

        fp=fopen("wyj.txt", "w");

        for(i=0; i
            fprintf (fp, "%c", zdanie[i]);

        fclose (fp);

    }

    if(strcmp(wsk2,off)==0)

    {

        for(i=0; i
            printf("%c",zdanie[i]);

        printf("\n");

        system("pause");

    }

    return 0;

}

Funkcja ta:

int litery(char ciag[])

{

int t=1;

int i;

for(i=0; i

{

if(ciag_==’ ’ && ciag[i+1]==’ ')_

{

t=i;

break;

}

}

}

Sprawdza mi, czy jakieś tam zdanie ma wartość ‘spacja’ i czy następny znak również na wartość ‘spacja’ (można dla pewności dodać jeszcze zdanie[i+2], i+3 itd… chociaż pewnie nie tędy droga.

Ale jako tako to działa - dostałem to, co chciałem. Problem pojawia się dopiero, jak dostaniemy na wejściu w pliku kilka spacji pod rząd - może ktoś sobie coś takie wymyślił i już. I co wtedy? Może by to jakoś przerobić?

Czy dobrze rozumiem: chcesz wczytać plik zastępując dowolny ciąg składający się ze spacji,tabulacji i enterów na pojedynczą spacje?