• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C funkcja otwierająca pliki

Object Storage Arubacloud
0 głosów
755 wizyt
pytanie zadane 29 listopada 2017 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

W jaki sposób mogę stworzyć funkcję, która będzie służyła do otwierania pliku/plików tekstowych tak, aby przekazany oryginalny argument trzymał ten plik?

Próbowałem w ten sposób, ale nie działa. Program powinien wypisać zawartość pliku na ekran.

#include <stdio.h>

int openFile(FILE** inputFile)
{
    *inputFile = fopen("input.txt", "r");

    if (*inputFile != NULL)
        return 0;
    else
        return -1;
}
void readWholeFile(FILE* inputFile)
{
    char str[20];
    while (feof(inputFile)) {
        fscanf(inputFile, str);
        printf("%s\n", str);
    }
}
int main() {

    FILE* inputFile;

    if (openFile(&inputFile) == 0) {
        readWholeFile(&inputFile);
        fclose(inputFile);
    }
    else
        printf("File didn't open");

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 29 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

spróbuj tak

...
int openFile(FILE* inputFile)
...
void readWholeFile(FILE* inputFile)
...

a w funkcji main()

    if (openFile(inputFile) == 0) {
        readWholeFile(inputFile);
        fclose(inputFile);
    }

Wtedy program Ci pójdzie. Co do Twojego głównego problemu czy dereferencja czy kopiowania FILE* jest w ogóle dozwolone. Powinieneś używać FILE* lokalnie tzn wszystkie operacje powinny być w jednym zakresie blokowym. Tutaj masz więcej info

http://en.cppreference.com/w/c/io

komentarz 29 listopada 2017 przez Sinnley Stary wyjadacz (12,810 p.)

Nie wiem czy dobrze zrozumiałem, ale dla tego kodu, program wywala brak odpowiedzi.

#include <stdio.h>

int openFile(FILE* inputFile)
{
    inputFile = fopen("input.txt", "r");

    if (inputFile != NULL)
        return 0;
    else
        return -1;
}
void readWholeFile(FILE* inputFile)
{
    char str[20];
    while (feof(inputFile)) {
        fscanf(inputFile, str);
        printf("%s\n", str);
    }
}
int main() {

    FILE* inputFile;

    if (openFile(inputFile) == 0) {
        readWholeFile(inputFile);
        fclose(inputFile);
    }
    else
        printf("File didn't open");

    return 0;
}

 

komentarz 29 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Właśnie tak,

u mnie kompilator zwraca coś takiego:

Invalid parameter passed to C runtime function.

Podałem jeszcze pod wątpliwość czy jest możliwość wykonania Twojego zadania. Nie wiem czy jest możliwość jakiejś wartości FILE* przypisania jej wartości, wyjście z jednego zakresu i dalej jej prawidłowe działanie.

komentarz 29 listopada 2017 przez Sinnley Stary wyjadacz (12,810 p.)
Nie do końca rozumiem mimo wszystko dlaczego początkowy kod nie chce działać.

Przecież przesyłam wskaźnikowi na wskaźnik adres tego lokalnego dla maina wskaźnika na plik, którym chce otworzyć ten plik input.txt.

Program nie wypisuje "File didn't open", więc plik powinien zostać otwarty w oryginalnym wskaźniku, tym w mainie. Mimo to potem funkcja do wyczytywania pliku jakby dostaje pusty plik, bo wcale nie wchodzi do while'a który ma czytać kolejne słowa, tak, jakby od razu łapał koniec pliku. Nie bardzo rozumiem czemu, skoro plik nie jest pusty i zostaje otwarty dla odpowiedniej zmiennej,
komentarz 29 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

http://www.cplusplus.com/reference/cstdio/FILE/

i.e., the pointer to a copy of a FILE object could be interpreted differently than a pointer to the original).

Może tutaj jest problem ale do końca nie jestem pewien

0 głosów
odpowiedź 29 listopada 2017 przez j23 Mędrzec (194,920 p.)
edycja 29 listopada 2017 przez j23
readWholeFile(&inputFile);
readWholeFile(inputFile);

 

fscanf(inputFile, str);

O format-stringu zapomniałeś. Do czytania całych linii użyj gets()/gets_s().

 

komentarz 29 listopada 2017 przez Sinnley Stary wyjadacz (12,810 p.)
Przecież do readWholeFilemusze wrzucić właśnie sam wskaźnik, a nie jego adres.

Inna sprawa - ja nie chce czytać całych linii tylko właśnie zbierać pojedyncze słowa.
komentarz 29 listopada 2017 przez j23 Mędrzec (194,920 p.)

Przecież do readWholeFile musze ...

A co ja pokazałem? Poprawiłem Twój kod.

ja nie chce czytać całych linii ...

fscanf(inputFile, "%s", str); 

// tak bezpieczniej
fscanf_s(inputFile, "%s", str, (rsize_t)sizeof(str)) ;

str powinien mieć więcej niż 20 znaków.

 

komentarz 30 listopada 2017 przez Sinnley Stary wyjadacz (12,810 p.)

Czy wobec tego deklaracja str powinna wyglądać w ten sposób?

char * str = NULL;

 

komentarz 30 listopada 2017 przez j23 Mędrzec (194,920 p.)

Skąd taki wniosek? str niech będzie tablicą, tylko większą niż 20 znaków. Tak małą tablicę łatwo przekroczyć (chyba że użyjesz bezpiecznej wersji fscanf).

Podobne pytania

0 głosów
2 odpowiedzi 663 wizyt
pytanie zadane 1 września 2016 w Python przez Pan Kulomb Pasjonat (18,630 p.)
0 głosów
1 odpowiedź 21,170 wizyt
0 głosów
3 odpowiedzi 452 wizyt
pytanie zadane 23 grudnia 2019 w C i C++ przez BezBarwny Użytkownik (700 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...