Witam, napisałem sobie program, który poprawnie wczytuje i przetwarza dane z pliku tekstowego pod Linuxem. Ten sam kod pod Windowsem ni jak nie chce działać. Sprawdziłem sobie pod windowsem taki kod(linuxowy działa na tej samej zasadzie):
[code]
FILE * plik;
plik = fopen("liczby.txt", "r");
fscanf(plik, "%d", &n);
printf("%d", n);
fclose(plik);
[/code]
który też nie działa. W pliku znajduje się tylko liczba 10, po wczytaniu wyświetla 0. O CO TU CHODZI?
Prawie na 100% chodzi o ukrywanie znanych rozszerzeń, twój plik nazywa się "liczby.txt.txt"
najpierw sprawdź czy poprawnie otwierasz plik (możesz mieć włączone budowanie w innym miejscu a plik "liczby.txt" w innym miejscu).
Reszta powinna działać bez różnic.
Niestety to nie to - ten sam kod na tych samych plikach pod linuxem działał bez problemu. Pytałem zresztą o to we wcześniejszych wątkach (na innne problemy się natknąłem podczas pisania). To co tutaj podałem, po prostu skróciłem, żebyzobaczyć czy działa to na pojedynczym wczytaniu liczby - niestety nie działa. Przypomnę, że chodzi o kod:
[code]
FILE * plik;
//ścieżka do pliku
plik = fopen("czworokat.in", "r");
//wczytywanie kolejnych współrzednych
fscanf(plik, "(%d,%d),(%d,%d),(%d,%d),(%d,%d) ", ax,ay,bx,by,&cx,&cy,&dx,&dy);
//zamknięcie strumienia
fclose(plik);
[/code]
po wyrzuceniu printfem tego co wczytałem z pliku dostaję coś takiego:
a w pliku znjduje się: (0,0),(2,0),(3,3),(0,2).
A podejrzałeś ten plik pod Windowsem? być może problemem jest np znak nowej linii.
Tak, wyglada okej. Próbowałem kombinacji typu, dodanie spacji na końcu, jakieś puste entery po i nic. W jaki sposób, sugerowałbyś to sprawdzić?
Hexedytorem.
Błąd jest tu:
whose napisał(a):
fscanf(plik, "(%d,%d),(%d,%d),(%d,%d),(%d,%d) ", ax,ay,bx,by,&cx,&cy,&dx,&dy);
ma być: &ax,&ay,&bx,&by
@_13th_Dragon mnie ubiegł :)
A tu masz kod ze sprawdzaniem błędów, bo to co wskazał @_13th_Dragon nie wyjaśnia wszystkiego (cześć danych powinna się dobrze wczytać)
FILE * plik;
plik = fopen("czworokat.in", "r");
if (plik) {
int n = fscanf(plik, "(%d,%d),(%d,%d),(%d,%d),(%d,%d) ", &ax,&ay,&bx,by,&cx,&cy,&dx,&dy);
fclose(plik);
if (n!=8) {
printf("Nie wczytano wszystkich danych. Udalo się wczytac %d danych", n);
} else {
printf("Wszystko ok\n(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n",ax,ay,bx,by,cx,cy,dx,dy);
}
} else {
printf("Nie udalo sie otworzyc pliku\n");
}
Z plikiem wyglada wszystko okej w programie. Natomiast inna dziwna rzecz jest, dodałem do pliku coś takiego:
[code]
if(plik == NULL)
{
printf("null\n");
}
[/code]
i po kompilacji i uruchomieniu wyświetla się te null w konsoli, czyli warunek jest prawdziwy... Tak jakby pliku nie było, a to dziwne, bo wczytuje ww wartości. Chociaż w innej kombinacji (1szej w poście nie wczytuje nic)
Edit:
Już sprawdzam Marek, co mi wyrzuci.
Edit2:
"Nie udało się otworzyć pliku"
czyli od początku miałem rację. Upewnij się co do nazwy pliku i że ten plik jest w tej lokalizacji, z której uruchamiasz plik wykonalny i/lub w tej lokalizacji co plik wykonalny.
Najlepiej spróbuj uruchamiając to z linii poleceń.
Sprawdź nazwę pliku przez:
Start -> Uruchom -> cmd.exe
dir "c:\scieżka_do_pliku\czworokat.in*"
Założę się ze twój plik nazywa się "czworokat.in.txt".
Upewniłem się(+dowód http://screenshu.com/static/uploads/temporary/j8/xq/9n/i3ddr8.jpg ), nadal to samo. To mi wygląda na to, że program nie ma dostępu(uprawnień) do otworzenia pliku. Tylko dlaczego?
Edit:
Dragon już patrzę
Edit 2:
Dragon, niestety przegrałbyś;p
http://screenshu.com/static/uploads/temporary/y2/lh/ov/es7v3p.jpg
plik .txt utworzony do testów, czy zadziała(zamiast .in), niestety efekt ten sam...
To może podaj prawdziwą zawartość pliku czworokat.in oraz prawdziwy kod którym próbujesz to wczytać.
czworokat.in:
[code]
(0,0),(2,0),(3,3),(0,2)
[/code]
kod wczytujący:
[code]
FILE * plik;
//Ścieżka do pliku, otwarcie pliku do odczytu
plik = fopen("czworokat.in", "r");
if(plik == NULL)
{
printf("null\n");
}
//wczytywanie kolejnych współrzednych
fscanf(plik, "(%d,%d),(%d,%d),(%d,%d),(%d,%d) ", &ax,&ay,&bx,&by,&cx,&cy,&dx,&dy);
printf("%d\n", ay);
//zamknięcie strumienia
fclose(plik);
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", ax,ay,bx,by,cx,cy,dx,dy);
[/code]
EDIT:
Rozwiązałem problem! To co zrobiłem to: z poziomu użytkownika(mam prawa administratora) utworzyłem, nowy folder, nowy plik z kodem i nowy plik z danymi wejsciowymi. Po przekopiowaniu do nich danych i uruchomieniu, magia - wszystko zadziałało. Wydaje mi się, że problem mógł wynikać z tego, że pliki które wcześniej próbowałem uruchomić były skopiowane (i utworzone) poprzez program WinSCP. Pliki kopiowałem prosto z serwera hostującego(poprzez połączenie SCP).
To za co chciałby podziękować to pomoc w zlokalizowaniu problemu - nie otwierający się plik. Siedziałem nad tym do bardzo późna i nie udało mi się nic wskórać. Brawa dla was!
Spróbuj odpalić:
zad2poprawione.exe
przez cmd.
Bo może twoje IDE odpala to w jakimś innym "roboczym" folderze.
Próbowałem też tej kombinacji, niestety nie działało. Problem rozwiązałem (edit powyżej), jak trochę ochłonę to spróbuję podociekać co tak właściwie nie działało. Tymczasem uciekam. Raz jeszcze dziękuje!