Spezielle Zeile aus Text Datei einlesen



  • Hallo,
    ich bastel gerade an einem Programm wo ich erst eine Text-Datei ausgebe und dann von der Console einlesen möchte welche Zeile eingelesen werden soll und dann in ein Array abgespeichert wird.
    Hab auch schon den ersten Ansatz fertig nun funktioniert er leider nicht so wie ich es gerne hätte.

           printf("\nEnter the line number to read : ");
    	scanf("%d", &line);
    
    	int ch, newlines = 1;
    	while ((ch = fgetc(datei)) != EOF) {
    	    if (ch == '\n') {
    	        newlines++;
    	        if (newlines == line)
    	        	fgets(matrix, 82, datei);
    	            break;
    	    }
    	}
    
    

    Das Ausgeben der Text Datei ist kein Problem lediglich die Einzelnde Zeile einlesen sorgt für Probleme.
    Habt ihr vielleicht ein paar Tipps?



  • Da fehlen zumindest geschweifte Klammern. Ansonsten bricht die schleife nach dem ersten '\n' ab (durch das break).



  • @ccoder94 sagte in Spezielle Zeile aus Text Datei einlesen:

    Habt ihr vielleicht ein paar Tipps?

    #include <stddef.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	fputs("filename: ", stdout);
    	char filename[1024];
    	if (!fgets(filename, sizeof filename, stdin)) {
    		fputs("Input error :(\n\n", stderr);
    		return EXIT_FAILURE;
    	}
    
    	size_t filename_length = strlen(filename);
    	if (filename_length && filename[filename_length - 1] == '\n')
    		filename[filename_length - 1] = '\0';
    
    	FILE *file = fopen(filename, "r");
    	if (!file) {
    		fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", filename);
    		return EXIT_FAILURE;
    	}
    
    	for (int ch = fgetc(file); ch != EOF; ch = fgetc(file))
    		putchar(ch);
    
    	rewind(file);
    
    	int line_to_print;
    	fputs("\nline #? ", stdout);
    	if (scanf(" %d", &line_to_print) != 1 || !line_to_print) {
    		fputs("Input error :(\n\n", stderr);
    		fclose(file);
    		return EXIT_FAILURE;
    	}
    
    	for (int current_line = 1; current_line < line_to_print; ++current_line)
    		for (int ch = fgetc(file); ch != '\n' && ch != EOF; ch = fgetc(file));
    
    	if (feof(file) || ferror(file)) {
    		fprintf(stderr, "There is no line #%d in \"%s\" :(\n\n", line_to_print, filename);
    		fclose(file);
    		return EXIT_FAILURE;
    	}
    	
    	for (int ch = fgetc(file); ch != '\n' && ch != EOF; ch = fgetc(file))
    		putchar(ch);
    	putchar('\n');
    
    	fclose(file);
    }
    

    @ccoder94 sagte in Spezielle Zeile aus Text Datei einlesen:

    und dann in ein Array abgespeichert wird.

    Ach so.

    #include <stddef.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    enum { BUFFER_SIZE = 20 };
    
    int main()
    {
    	fputs("filename: ", stdout);
    	char filename[1024];
    	if (!fgets(filename, sizeof filename, stdin)) {
    		fputs("Input error :(\n\n", stderr);
    		return EXIT_FAILURE;
    	}
    
    	size_t filename_length = strlen(filename);
    	if (filename_length && filename[filename_length - 1] == '\n')
    		filename[filename_length - 1] = '\0';
    
    
    	FILE *file = fopen(filename, "r");
    	if (!file) {
    		fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", filename);
    		return EXIT_FAILURE;
    	}
    
    	for (int ch = fgetc(file); ch != EOF; ch = fgetc(file))
    		putchar(ch);
    
    	rewind(file);
    
    	int line_to_print;
    	fputs("\nline #? ", stdout);
    	if (scanf(" %d", &line_to_print) != 1 || !line_to_print) {
    		fputs("Input error :(\n\n", stderr);
    		fclose(file);
    		return EXIT_FAILURE;
    	}
    
    	for (int current_line = 1; current_line < line_to_print; ++current_line)
    		for (int ch = fgetc(file); ch != '\n' && ch != EOF; ch = fgetc(file));
    
    	if (feof(file) || ferror(file)) {
    		fprintf(stderr, "There is no line #%d in \"%s\" :(\n\n", line_to_print, filename);
    		fclose(file);
    		return EXIT_FAILURE;
    	}
    	
    	size_t line_buffer_size = BUFFER_SIZE;
    	char *line_buffer = malloc(line_buffer_size + 1);
    	if (!line_buffer) {
    		fputs("Out of memory :(\n\n", stderr);
    		fclose(file);
    		return EXIT_FAILURE;
    	}
    
    	size_t line_buffer_used = 0;
    	for (int ch = fgetc(file); ch != '\n' && ch != EOF; ch = fgetc(file)) {
    		if (line_buffer_used + 1 == line_buffer_size) {
    			char *temp = realloc(line_buffer, (line_buffer_size *= 2) + 1);
    			if (!temp) {
    				fputs("Out of memory :(\n\n", stderr);
    				free(line_buffer);
    				fclose(file);
    				return EXIT_FAILURE;
    			}
    			line_buffer = temp;
    		}
    
    		line_buffer[line_buffer_used++] = ch;
    	}
    	line_buffer[line_buffer_used] = '\0';
    	puts(line_buffer);
    	free(line_buffer);
    	fclose(file);
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    const char *schiller= 
    	        "Wer wagt es, Rittersmann oder Knapp,\n"
    		"Zu tauchen in diesen Schlund ?\n"
    		"Einen goldnen Becher werf ich hinab,\n"
    		"Verschlungen schon hat ihn der schwarze Mund.\n"
    		"Wer mir den Becher kann wieder zeigen,\n"
    		"Er mag ihn behalten, er ist sein eigen.";
    
    /* liest ab aktueller stream-Position bis vor nächstes '\n' oder EOF und gibt einen String darauf zurück */
    /* Deinitialisieren mit Parameter NULL */
    char* line(FILE* f)
    {
    	static char* s;
    	if (f)
    	{
    		int c; char i;
    		s = s ? *s = 0, s : calloc(1, 2);
    		while ((c = fgetc(f)) != EOF && c != '\n')
    			strncat(s = realloc(s, strlen(s) + 2), (i=c,&i), 1);
    		return feof(f)&&!*s?0:s;
    	}
    	free(s);
    	return s = 0;
    }
     
    int main()
    {
    	char* s,*a=0;
    	int i,w;
    	FILE* f = fmemopen(schiller, strlen (schiller), "r"); /* fmemopen ist kein C-Sprachstandard, normalerweise steht hier das fopen */
    
    	while (s = line(f)) puts(s);
    	rewind(f);
    	scanf("%d", &w);
    	for (i = 1; s = line(f); ++i)
    		if (i == w)
    			puts(strcpy(a = malloc(strlen(s) + 1), s));
    
            /* aufräumen */
    	fclose(f);
    	line(0);
    	free(a);   /* hier steht die Zeile drin */
    	return 0;
    }
    

    https://onlinegdb.com/BkMiV4R3S



  • @Wutz sagte in Spezielle Zeile aus Text Datei einlesen:

    s = s ? *s = 0, s : calloc(1, 2);
    

    yay 🎅


Log in to reply