Skocz do zawartości

Operacje plikowe, czy mogę po raz drugi przypisać wartość pod wskaźnik?


_LM_

Pomocna odpowiedź

Tak jak w tytule plus dodatkowe pytanie, wytłumaczę na podstawie kodu.

Mam pamięć która przechowuje parametry transmisji zapisane jako csv (świadomie zrezygnowałem z JSON) następnie po zainstalowaniu systemu plików i odnalezieniu tego z parametrami "reg1.txt"[będzie .csv] robię dwie rzeczy: zliczam ile jest linii(wierszy) w pliku i przesyłam kolejne wiersze do funkcji dekodującej.

            while ((d = readdir(dh)) != NULL) {
                printf("DIR %s\n", d->d_name);
                
                  if(0 == (strcmp(d->d_name,"reg1.txt")))
                {
					FILE * f = fopen("/usb/reg1.txt", "r");
		   			char line[128];

                    int l = 0;
    		if(mdbTask != NULL){
			vTaskSuspend(mdbTask);		
    			while(fgets(line, sizeof(line), f)) //where sizeof(buf) is the length of   
                                   //line you anticipate reading in.
{
    //do something with buf here;
    //The input of fgets will be NULL as soon 
    //as its input fp has been fully read, then exit the loop  
      l++;
}

decode_csv(NULL,l);
		FILE * f = fopen("/usb/reg1.txt", "r");
	//	printf("test1\n");


while(fgets(line, sizeof(line), f)) //where sizeof(buf) is the length of   
{
	decode_csv(line, 0);
}


Pierwsze otwarcie pliku ma na celu zliczenie linii, jest to później potrzebne gdyż stosuję dynamiczną alokację pamięci. Problem był kiedy chciałem przesłać do funkcji "decode_csv" kolejne linie z pliku. Poradziłem sobie przypisując ponownie wskaźnik file * f nie jestem pewien czy to prawidłowe rozwiązanie? Ewentualnie czy istnieje inny sposób na zliczenie wierszy w pliku tekstowym? Poniżej plik na którym testuję 
 

U1,1,4,2,0,1,V
I1,1,4,2,6,1,A
P1,1,4,2,18,1,W

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Ok to sobie odpowiem 😉 plik przed kolejnym odczytem trzeba zamknąć bo inaczej w pamięci pojawiają się błędy. Poprawiony kod

            while ((d = readdir(dh)) != NULL) {
                printf("DIR %s\n", d->d_name);
                
                
                if(0 == (strcmp(d->d_name,"reg1.txt")))
                {
					FILE * f = fopen("/usb/reg1.txt", "r");
					
    			char line[128];

    			
    			int l = 0;
    	if(mdbTask != NULL){
			vTaskSuspend(mdbTask);		
    			while(fgets(line, sizeof(line), f)) //where sizeof(buf) is the length of   
                                   //line you anticipate reading in.
{
    //do something with buf here;
    //The input of fgets will be NULL as soon 
    //as its input fp has been fully read, then exit the loop  
      l++;
}

decode_csv(NULL,l);
		
		fclose(f); // <--- zamykam i ponownie otwieram
		FILE * f = fopen("/usb/reg1.txt", "r");
printf("test1\n");

while(fgets(line, sizeof(line), f)) //where sizeof(buf) is the length of   
{
	decode_csv(line, 0);
}

vTaskResume(mdbTask);
}

 printf("\n");
fclose(f);

Nadal jest pytanie otwarte w jaki sposób zliczyć wiersze w otwartym pliku, moja metoda jest "na partyzanta" a może dobra?
 

Link do komentarza
Share on other sites

ftell, fseek i cała czereda - coś w stylu:

f=fopen(cośtam,"r");
n=policz_linie(f);
fseek(f,0,SEEK_SET);
// jesteś na początku pliku

Jeśli użyjesz wartości zwracanej przez ftell, możesz się ustawić na tej pozycji.

Oczywiście pliki otwarte do odczytu!

ESP IDF trzyma się POSIX-a jak tylko może.

 

Edytowano przez ethanak
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

jakby JSON nie był tak pamięciożerny to byłby elegancki do tego zastosowania. CSV ma tę zaletę że można go w prosty sposób utworzyć nawet w notatniku. Ok po to się pytałem żeby poznać inne metody

Link do komentarza
Share on other sites

rewind nie zwróci mi ilości wierszy w pliku

2 minuty temu, ethanak napisał:

 dlaczego pamięciożerny?

sam plik nie, ale jego parser już zabiera trochę zasobów, wciąż mówimy o systemach wbudowanych  

Link do komentarza
Share on other sites

1 minutę temu, ethanak napisał:

ale patrzyłeś na te trzy linijki kodu co pokazałem czy rafalejesz?

Bez przesady 😄 już się robi...

Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, ethanak napisał:

Ale ja i tak bym użył listy...

O ile napisanie (funkcji) listy jednokierunkowej jest dla mnie wykonalne to nie bardzo rozumiem w jaki sposób zapisać taką listę w pliku na etapie jego tworzenia. Bo jeśli mam zbiór wartości które mają być później użyte, utworzenie prostego csv jest wg mnie logiczne. Po prostu nie łapię jak ten csv utworzyć jako listę?
 

//Teraz jest tak
U1,1,4,2,0,1,V
I1,1,4,2,6,1,A
P1,1,4,2,18,1,VA
// Jak formatować listę?
0:U1,1,4,2,0,1,V
1:I1,1,4,2,6,1,A
2:P1,1,4,2,18,1,VA  
  
  

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.