Operacje na wszystkich linijkach pliku tekstowego

0
 int i=1;
 char ciag0;
 char ciag1[20];
 char ciag2[20];
    FILE *fp;
	fp=fopen ("dane.txt", "r");
	while (fgetc(fp) != EOF)
	{
		fscanf(fp, "%s%s%s", &ciag0, &ciag1, &ciag2);
		while (i<=20)
		{
                                  ciag1[i]=toupper(ciag1[i]);
			ciag2[i]=toupper(ciag2[i]);
			i++;
		}
		printf("%s %s\n", ciag1, ciag2);
	}

Mam taki problem. Program zamienia mi tylko 1 linijkę we wczytanym wierszu, a następne pozostawia bez zmian. Jak zrobić, żeby program zamieniał wszystkie linijki? Plus jeszcze chciałbym, żeby zliczał mi występowanie danych słów na wyjściu po zamianie na duże litery. Dokładnie rzecz biorąc mając listę obecności przykładowo tak:

  1. Jan Kowalski
    ...
    i ileś tam tych Janów w liście wyświetlał mi JAN 3 (dla 3 imion w pliku)
0

Nie zagłębiałem się w sam sposób i rozwiązanie problemu, ale:

  1. W C tablice są indeksowane od 0 a nie od 1. W Twoim przypadku to powinno być 0-19, a nie 1-20.
  2. Nie zerujesz i po zmianie pierwszej linii i od drugiej while(i<=20) nigdy nie jest spełnione.
    ...
    edit: 3. W jakim celu używasz while( fgetc(FB) != EOF ). Wystarczy sam fscanf w pętli while, tzn zamiast używać w warunku pętli fgetc użyj fscanf i od razu odczytujesz tam swoje dane.
0

A może ktoś wie, jak zliczyć te imiona (ciag1) i wypisać na wyjśćiu?

0
 #include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{char ciag0[1];
char ciag1[20];
char ciag2[20];

FILE *fp;
fp=fopen ("dane.txt", "r");
while (fgetc(fp) != EOF)
{

fscanf(fp, "%s%s%s", &ciag0, &ciag1, &ciag2);
int i=0;
while (i<=19)

{
ciag1[i]=toupper(ciag2[i]);
ciag2[i]=toupper(ciag2[i]);
i++;

}

printf("%s %s\n", ciag0, ciag2);

}

system("PAUSE");
return EXIT_SUCCESS;
}

tak teraz wygląda mój kod. chce, żeby mając listę obecności w pliku miał zliczoną liczbę imion i podał ją w kolejności od największej do najmniejszej. więcej info: http://www.spoj.pl/problems/NAMES/

0

Proponuję zadeklarować sobie strukturę w której będziesz przechowywał imię i ilośc jego wystąpień. Następnie jakąś prostą listę uporządkowana w której przechowasz informacje o wystąpieniach.

0

A jak najprościej to zrobić? Bo akurat działania struktur nie za bardzo rozumiem ;)

0

kodimks: w tagu dałeś [C], a przykład zrobiłeś w C++. zdecyduj się. jeśli ma być C++, to ilość wystąpień trzymaj w map<string,int>.

0

Właśnie ma być w C. A co dokładnie mam z C++?

0
kodimks napisał(a)

Właśnie ma być w C. A co dokładnie mam z C++?

Choćby to #include <iostream>

0

Czyli zamiast ciag1 mam wstawić na przykład coś takiego?

 
struct {
char[20] imie
} 
imiona[10000]
0

"w której będziesz przechowywał imię i ilośc jego wystąpień", czyli:

struct
{
   char imie[20];
   int ilosc;
}

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