C - Błąd podczas wczytywaniu danych z pliku

0

Witam.

Plik in.txt:

4
A tekstA
B tekstB
C tekstC
D tekstD

Funkcja w programie:

void Wczytaj(){

	FILE* plik=fopen("in.txt", "r");
    if(plik==NULL){
	    printf("Plik nie istnieje!\n");
	    return;
	}

	fscanf(plik, "%d", &n);
	printf("n= %d\n", n);
	char znak;
	char tekst[100];

    while(fscanf(plik, "%c %s", &znak, tekst) == 2){
    	printf("%c %s\n", znak, tekst);
    }
    
    fclose(plik);		
}

Efekt w konsoli:

user image

Dlaczego to tak wygląda po wypisaniu? Przecież nigdzie nie mam żadnych dodatkowych spacji i enterów.

0
    while(fscanf(plik, "%c %s", &znak, tekst) == 2){
        printf("%c%s", znak, tekst);
    }

niepotrzebne "\n" i " " pomiędzy zmiennymi

0

Dlaczego niepotrzebne? Czemu w tym przypadku należy je usunąć?
Po drugie chciałbym zapisać wszystkie znaki, np. w tablicy.

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

int n;

void Wczytaj(){
	int i=0;
	//WCZYTYWANIE Z PLIKU
	FILE* plik=fopen("in.txt", "r");
    if(plik==NULL){
	    printf("Plik nie istnieje!\n");
	    return;
	}

	fscanf(plik, "%d", &n);

	char znak;
	char tekst[6];
	char znaki[10];

    while(fscanf(plik, "%c %s", &znak, tekst) == 2){
    	printf("%c%s", znak, tekst);
    	znaki[i]=znak;
    	i++;
    }
    
    for(i=0; i<n; i++)
    	printf("%c", znaki[i]);

    fclose(plik);		
}

int main() {
	
	
	Wczytaj();
	
	return 0;
} 

W miejscu, gdzie powinny wyświetlić się znaki, nie wyświetla się nic.

EDIT:
Dodając wyświetlanie licznika ( zmienna i ) widzę, że fscanf wykonuje się 8 razy. Nie powinien wykonać się tylko n razy?

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

int n;

void Wczytaj(){
	int i=0;
	//WCZYTYWANIE Z PLIKU
	FILE* plik=fopen("in.txt", "r");
    if(plik==NULL){
	    printf("Plik nie istnieje!\n");
	    return;
	}

	fscanf(plik, "%d", &n);

	char znak;
	char tekst[6];
	char znaki[10];

    while(fscanf(plik, "%c %s", &znak, tekst) == 2){
    	printf("%c%s", znak, tekst);
    	znaki[i]=znak;
    	i++;
    	printf(" %d ", i);
    }
    
    for(i=0; i<n; i++)
    	printf("%c", znaki[i]);

    fclose(plik);		
}

int main() {
	
	
	Wczytaj();
	
	return 0;
} 
0

wyświetlasz zmienną, ale oprócz zmiennej wyświetlasz dodatkowo spację i znak nowej linii, w twoim przypadku while wyświetla nowe słowo, nie musisz wyświetlać dla tego słowa spacji, czy \n, w pliku masz 8 słów, a więc scanf wykona się 8 razy, a druga rzecz to pętla for Ci nie działa, niezależnie od n i tak wyświetli Ci cały tekst
Nie bardzo wiem co chcesz zrobić, wytłumacz dokładniej co chcesz zrobić, podeślę Ci na szybko zrobioną wersję tego jak możesz to wczytać i wpisać do tablicy znak po znaku, ale radziłbym poprawić, bo dosyć brzydko to wygląda, program dla Twojego pliku odczyta pierwsze 4 znaki i wypisze je do tablicy

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

int n;

void Wczytaj(){
    int i=0;
    //WCZYTYWANIE Z PLIKU
    FILE* plik=fopen("in.txt", "r");
    if(plik==NULL){
        printf("Plik nie istnieje!\n");
        return;
    }
    fscanf(plik, "%d", &n);
    printf("%d",n);
    char znak;
    char tekst[6];
    char znaki[n];

    while(fscanf(plik, "%c", &znak) == 1){
        znaki[i]=znak;
        i++;
    }

    for(i=0; i<n; i++)
    {
        printf("%c", znaki[i]);
    }

    fclose(plik);
}

int main() {


    Wczytaj();

    return 0;
}

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