Odczyt z dwóch plików na raz, prośba o pomoc

0

Witajcie!

Przedstawi mi ktoś jak najprostszy kod na odczyt z dwóch plików? Chodzi o to że, w obu plikach w poszczególnych linijkach są liczby i musimy na nich operować. Musimy od liczby pierwszej odejmować drugą i wypisywać wartość bezwzględną takiego równania. Jeśli np. doszliśmy do linijki 50-tej w pliku pierwszym i tam jest jakaś liczba, a w drugim pliku w tej samej linijce liczby nie ma - to jako drugą liczbę bierzemy zero. I tak aż w obu plikach (obu odpowiadających sobie numerami linijkach) nie będzie żadnych liczb.

4

no ale w czym problem?
otwierasz oba pliki i czytasz z nich naprzemiennie. Co w tym trudnego? Czym to się różni od sytuacji z jednym plikiem?

1

Dodałem sobie ten wątek do obserwowanych, bo wydaje się naprawdę interesujący i rozwojowy ;)

0

Jestem początkujący, coś tam próbowałem, ale skoro tutaj piszę to raczej średnio mi to wychodziło. Każdy kiedyś zaczynał :)

#include <stdio.h>
 #include <stdlib.h>


int main()
{	
FILE *plik1 = fopen("plik1.txt", "r");
FILE *plik2 = fopen("plik2.txt", "r");
int p,d,w,i=0;

while ( (fscanf(plik1, "%d", &p) != EOF) || (fscanf(plik2, "%d", &d) != EOF) )
{    // czytanie do końca obu plików
	if( fscanf(plik1, "%d", &p) == EOF ) p=0; //jeśli w pliku pierwszym dalsze linie są puste
	else fscanf(plik1, "%d", &p);
	if( fscanf(plik2, "%d", &d) == EOF ) d=0; //jeśli w pliku drugim dalsze linie są puste
	else fscanf(plik2, "%d", &d);
	w=p-d;
	if(w<0) w=-w;
    printf("%d\n",w);
    i++;
}

fclose(plik1);
fclose(plik2);
	return 0;
}

pewnie coś popsułem, bo prócz tego, że program się kompiluje, to nic mi nie wypisuje

4

Przydatne funkcje:

0

Próbuję napisać od początku z tym gets, ale już na samym starcie są kłopoty

int main()
{	
	FILE *plik1;
	plik1=fopen("plik1.txt", "r");
   char a[18];
   while (fgets(a,18,plik1) != NULL)
	{
		fgets(a,18,plik1);
	 printf( "%s\n", a );	
	};
	fclose(plik1);

	return 0;
}

pobieram z każdej linii liczbe jako napis, później będę chciał ją zamieniać na int. niby powinno wypisywać po kolei te znaki, ale program się kompiluje i nic poza tym. pomóżcie, mam czas do środy :/

3

Nie sprawdzasz czy otwarcie pliku powiodło się.
Nieparzyste linie testujesz ale wyświetlasz parzyste.
Wyświetlasz dodatkowy znak '\n'.

https://wandbox.org/permlink/R5YUQ39nIezRa5Da

0
Delor napisał(a):

Nie sprawdzasz czy otwarcie pliku powiodło się.
Nieparzyste linie testujesz ale wyświetlasz parzyste.
Wyświetlasz dodatkowy znak '\n'.

https://wandbox.org/permlink/R5YUQ39nIezRa5Da

Dobra, już coś powoli łapie. Przerobiłem trochę ten Twój kod delor, ale jest jeszcze jeden problem. Pętla while działa dopóki w równoległych sobie liniach z jednego i drugiego pliku mamy jakieś liczby. W pierwszym pliku jest 10 liczb, w drugim jest 5. I nie wiem jak zrobić, żeby drugi plik dopełniało do tych dziesięciu linii.

https://wandbox.org/permlink/tl72NDog6bVucggG

0

A w jaki sposób na dopełnić?

0
sig napisał(a):

A w jaki sposób na dopełnić?

pusta linia = zero
i dalej obliczać do końca, aż równoległe linie z jednego i drugiego pliku będą puste

3

No to kolejna pomocna funkcja: feof().

0

Dobra, gotowe. Dzięki bardzo Delor za pomoc :)

https://wandbox.org/permlink/FwZwnZBpzRWC8KNJ

0

Przepraszam za ewentualne błędy, ale piszę z telefonu i nie mogę zweryfikować poprawności, ale dlaczego nie zrobić tego po prostu tak:

#include <stdio.h>
#include <stdlib.h>

#include <math.h>

int main()
{
    FILE *f1, *f2;
    f1 = fopen("plik1.txt", "r");
    f2 = fopen("plik2.txt", "r");
    if (!f1 || !f2) return 1;
    int a, b;
    a=b=0;
    while (fscanf(f1, "%d", &a) || fscanf(f2, "%d", &b)) {
        printf("%d", fabs(a-b)); //to można rozwiązać bardziej elegancko, ale nie o to chodzi w moim przykładzie. 
        a=b=0;
    }
}
2

W założeniach miały być w plikach puste linie (traktowane jako wartość 0). fscanf je omija.
Funkcja zwraca ilość odczytanych pól lub EOF więc:

while (fscanf(f1, "%d", &a) || fscanf(f2, "%d", &b)) {

spowoduje, że tylko pierwsza część warunku się wykona. Na dodatek w nieskończonej pętli.

0
Delor napisał(a):

W założeniach miały być w plikach puste linie (traktowane jako wartość 0). fscanf je omija.
Funkcja zwraca ilość odczytanych pól lub EOF więc:

while (fscanf(f1, "%d", &a) || fscanf(f2, "%d", &b)) {

spowoduje, że tylko pierwsza część warunku się wykona. Na dodatek w nieskończonej pętli.

Jeszcze mam jedno pytanie. Jak zrobić, żeby nazwy plików na których mam prowadzić operacje wczytywać z wierszu poleceń? Żeby nie były podane już na starcie

0
int main(int argc, char *argv[]) //na wstępie dziękuję za pomoc :)
{
    int p,d,wb;
    FILE* plik1;
    FILE* plik2;
    if ((plik1 = fopen(*argv[1], "r")) && (plik2 = fopen(*argv[2], "r")))

co tu jest nie tak?

2

Zobacz w debugerze jakie masz wartości zmiennych i krok po kroku prześledź jak program działa.
Możesz też wypisać te wartości na ekran.

0

Super, dziękuję :D Okazało się, że Dev-C++, w którym próbowałem pisać na początku cały ten program - nie sprostał zadaniu. natomiast dzięki wandbox i onlinegdb dociągnąłem to do końca.
Ostatecznie przy użyciu konsoli w gdb i wpisaniu nazw plików tekstowych z jakich chce skorzystać, wszystko ładnie się skompilowało. Z pewnością będę z nich korzystał w przyszłości :)

https://onlinegdb.com/Sy7zAelDNV

3

Każdy developer odradzi Ci Dev C++, zwłaszcza ten oryginalny. Jak chcesz małe IDE, to Code::Blocks, a jak większe, to Visual Studio.

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