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

0

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 <windows.h>
#include <stdio.h>
#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<SIZE; 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<dlugosc; i++)
            fprintf (fp, "%c", zdanie[i]);
        fclose (fp);
    }
    if(strcmp(wsk2,off)==0)
    {
        for(i=0; i<dlugosc; i++)
            printf("%c",zdanie[i]);
        printf("\n");
        system("pause");
    }
    return 0;
}
0

fp=fopen("wyj.txt", "w");
zamień na:
fp=fopen("wyj.txt", "a");

a, jak append - będzie dodawał do końca pliku.

0
aurel napisał(a)

fp=fopen("wyj.txt", "w");
zamień na:
fp=fopen("wyj.txt", "a");

a, jak append - będzie dodawał do końca pliku.

No tak, ale ta zmiana powoduje przecież w pliku wyjściowym dodanie tekstu na koniec pliku - nie usunięcie całej jego zawartości, a następnie wpisania czegoś, a zostawia to, co jest, i wpisuje coś na koniec.

Przy pierwszym odpaleniu tworzy plik i mam na wyj.txt:
Lubię placki.
Odpalam ponownie i mam:
Lubię placki.Lubię placki.
itd.
?

0

No dobra, przerobiłem coś:

#include <windows.h>
#include <stdio.h>
#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<SIZE; 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<SIZE; ++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<dlugosc; i++)
            fprintf (fp, "%c", zdanie[i]);
        fclose (fp);
    }
    if(strcmp(wsk2,off)==0)
    {
        for(i=0; i<dlugosc; 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.

0

dlugosc=strlen(zdanie);
A jak wczytujesz z pliku, to wczytujesz ilość znaków = SIZE. Zamiast tego, wczytuj, aż skończy się plik i na podstawie tego zapamiętuj długość. Na początku inicjujesz sobie zdanie na rozmiar SIZE, nigdzie potem nie ustawiasz znaku końca łańcucha, więc łańcuch ma SIZE znaków. Stąd powiększa ci się rozmiar pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1