Wczytanie pliku tekstowego wysupuje program

Wczytanie pliku tekstowego wysupuje program
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

Witam
Mam bardzo dziwny dla mnie problem. Piszę program słownika T9 (ten znany z komórek). Napisałem go pod Linuksem z użyciem GTK i wszystko było ok. Kiedy chciałem go skompilować na Windowsie zaczął się niestabilnie zachowywać. Słowa są zapisywane w pliku tekstowym, wczytywane po kolei i dodawane do struktury danych za pomocą funkcji dodaj_slowo_do_slownika(). Niestety na Windowsie albo fopen zwraca NULL (plik istnieje, sprawdzałem ścieżkę bezwzględną i względną) kiedy za pomocą Visual Studio uruchomię program, albo okienko się włącza i szybko wyłącza (dla plików większych niż 1k, dla mniejszych działa), gdy uruchomię program wchodząc do odpowiedniego folderu. Tak wygląda problematyczna funkcja:

Kopiuj
void wczytaj_z_pliku()
{
	FILE *plik;
	char znak;
	char wyraz[50]; /* zakładam maksymalną długość słowa na 50*/
	char *gotowy_wyraz; /*dla niego będę alokował tyle ile potrzeba*/
	int i=0;
	plik = fopen("slowa.txt", "r");
	if(plik!=NULL)
	{
		while(!feof(plik))
		{
			fscanf(plik, "%c", &znak);
			if(feof(plik)) break;
			if(!czy_litera(znak))
			{
				gotowy_wyraz =(char *) malloc((i+1)*sizeof(char));
				wyraz[i]='\0';
				strcpy(gotowy_wyraz, wyraz);
				dodaj_slowo_do_slownika(root, gotowy_wyraz);
				i=0;
				continue;
			}
			else  
			{
				wyraz[i++]=znak;
			}
		}
		fclose(plik);
	}
	else 
	{
		extern GtkWidget * pasek; /*wypisuje w pasku statusu*/
		gtk_statusbar_push( GTK_STATUSBAR(pasek), 0, "Nie udało się załadować pliku słownika");
	}
}

Bardzo proszę o pomoc, jestem załamany tym wszystkim...

gargantuiczny
Może już najwyższy czas poznać obsługę debuggera.
gargantuiczny
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 12 lat
0
DA
  • Rejestracja:około 17 lat
  • Ostatnio:prawie 12 lat
0

zawsze sprawdzaj czy malloc poprawnie zaalokował pamięć. może dlatego program się wyłącza.


#define if(x) if(rand()%6 && (x)) u mad? <img src="http://e.deviantart.net/emoticons/t/trollface.png" alt="user image" />
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
Kopiuj
if(i) dodaj_slowo_do_slownika(root, gotowy_wyraz);

Wg mnie to powinno rozwiązać problem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

Dzięki za szybkie odpowiedzi.

Kopiuj
 if(i) dodaj_slowo_do_slownika(root, gotowy_wyraz);

to niestety nie pomogło...

sprawdzanie, czy poprawnie zaalokowało też nic nie wykryło.
Co do perror to nie wiem, co zrobić, żeby zobaczyć efekt, ponieważ w VS otwiera mi się okienko i nigdzie (chyba) nie widać standardowego wyjścia. Już gotowy program mogę uruchomić z użyciem cmd, ale tam nic nie wypisuje (nawet dla printf)
g_print, który działa normalnie na Linuksie tu nic nie robi...

edytowany 2x, ostatnio: appleman
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

To można uprościć ale błąd szukaj gdzie indziej:

Kopiuj
void wczytaj_z_pliku()
  {
   FILE *plik;
   char wyraz[50],znak;
   int i=0;
   plik=fopen("slowa.txt","r");
   if(plik)
     {
      while(fscanf(plik,"%c",&znak)==1)
        {
         if(!czy_litera(znak))
           {
            wyraz[i]='\0';
            if(i) dodaj_slowo_do_slownika(root,strdup(wyraz));
            i=0;
           }
         else wyraz[i++]=znak;
        }
      fclose(plik);
     }
   else 
     {
      extern GtkWidget * pasek; /*wypisuje w pasku statusu*/
      gtk_statusbar_push( GTK_STATUSBAR(pasek), 0, "Nie udało się załadować pliku słownika");
     }
  }

Ba może sprawdź ten poprawiony, ma szanse zadziałać :D


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
tubbs
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:13
2

chłopaki, nie kibicowaliście naszym i odpadliśmy ;)
a co do problemu ze słowniczkiem to nie mam zielonego pojęcia

AP
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 13 lat
0

@_13th_Dragon Niestety Twój uproszczony kod nie pomógł. Na razie program jakoś zaczął działać przy uruchomieniu spod Visual Studia (lokalizacją domyślną dla programu nie było miejsce, gdzie znajdował się plik exe, pewnie nie rozumiem jak dokładnie działa VS). Dzięki za dotychczasowe odpowiedzi, będę jeszcze szukał błędu, bo być może nie leży on w tym miejscu.

_13th_Dragon
Tak właśnie napisałem że błąd jest gdzie indziej. Uproszczenie dotyczyło tylko tego że to samo da się zapisać nieco zgrabniej. Zawsze możesz podać pełną ścieżkę do pliku.
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0
  1. Program prawdopodobnie będzie dawał możliwość edycji słownika. W takim wypadku polecam trzymać plik słownika w katalogu użytkownika:
    %APPDATA%/nazwa_twojej_aplikacji/slowa.txt na windzie.
    ~/.nazwa_twojej_aplikacji/slowa.txt na niksach.

  2. Nie zabezpieczasz się przed pustymi i zbyt długimi słowami. Również nie dodajesz do słownika ostatniego słowa.

Kopiuj
#define MAX_WORD_LEN 50

char word[MAX_WORD_LEN + 1];
int word_len = 0;
int c;
int at_word, was_at_word = 0;

do {
    c = fgetc(plik); // fgetc zwraca -1 jeśli znak nie mógł być wczytany (koniec pliku lub błąd IO), stąd "c" musi być int'em
    at_word = (c >= 0 && czy_litera(c));

    if (at_word) {
        if (word_len < MAX_WORD_LEN) {
            word[word_len++] = c;
        }
    } else if (was_at_word) {
        word[word_len] = '\0';
        word_len = 0;
        dodaj_slowo_do_slownika(root, strdup(word));
    }

    was_at_word = at_word;
}
while (c >= 0);
edytowany 9x, ostatnio: adf88
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)