Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202

    [C] leggere newline da un file di testo

    Ciao,

    vorrei prendere delle stringhe da un file di testo, e ho il problema che queste stringhe non sono interpretate correttamente in termini di caratteri speciali, in particolare il newline.

    Per capirci, se stampo a video "ciao\nragazzi" la seconda parola sarà a capo; se però stampo a video una variabile di tipo char* riempita con il contenuto di una riga del file di testo succitato, riga che sarà sempre "ciao\nragazzi", mi viene stampato a video proprio "ciao\nragazzi" con backslash ed n visti come caratteri assestanti.

    Apro il file in modalità testo, lo scorro con getline, estraggo la sottostringa e la copio nella variabile con strncpy.

    codice:
    	dictFileR = fopen(dictFilePath,"r");
    
    	while(getline(&oneLine, &nbytes, dictFileR)!=-1){
    		for(j=0; j<N_WORDS; j++){ 
    			// use strcspn() to calculate the length of the first substr in line before ":="
    			// alternatively, consider the use of strstr() or strchr()
    			tmp=strndup(oneLine,strcspn(oneLine,":"));
    			if(strcmp(tmp,wordList[j])==0){
    				valueLen=strlen(oneLine)-strlen(wordList[j])-2;	// 2 is the lentgh of ":="
    				d_words[j]=malloc(valueLen*sizeof(char));
    				strncpy(d_words[j],"",1);
    				strncpy(d_words[j], strncat(d_words[j], strndup(oneLine+strlen(wordList[j])+2, valueLen), valueLen), valueLen);
    			}	
    		} //end for	
    		free(tmp);
    	} // end while
    Se il contenuto copiato ad esempio in d_words[3] è "ciao\nragazzi", e poi faccio puts(d_words[3]) mi viene stampato a video "ciao\nragazzi" anzichè "ciao
    ragazzi"!

    Uso Linux, se può servire.

    Aiut!
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    bhò...onestamente ho provato a fare un piccolo programmino per testare quello che dici:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char str[20];
        strcpy(str,"ciao\nragazzi");
        puts(str);
        printf("\n\n");
        printf("%s\n", str);
        return 0;
    }
    e il mio output è:
    codice:
    ciao
    ragazzi
    
    ciao
    ragazzi
    PS: l'ho provato anche io su linux...ubuntu per la precisione!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Con quel codice funziona di sicuro, da me il problema è quando la stringa "ciao\nragazzi" viene letta da un file di testo
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Per forza succede: il file è ascii, quindi "\n" sono 2 caratteri, rispettivamente '\\' (scritto con la sequenza di escape) e 'n'.

    "\n" è una stringa di due caratteri, '\n' è un solo carattere.

    Perciò devi in qualche modo localizzare nella stringa letta la sotto-stringa "\n" e sostituirla con il carattere '\n'.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Con quel codice funziona di sicuro, da me il problema è quando la stringa "ciao\nragazzi" viene letta da un file di testo
    ahhhhhhhhhhhhhhhh.....non avevo capito che leggevi da un file di testo....ma quindi è come se hai un file d testo con scritto:
    codice:
    ciao\nragazzi
    ciao\nragazze
    ...
    e devi leggere da questo file e stampare:
    codice:
    ciao
    ragazzi
    ciao
    ragazze
    è così??
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da MrX87
    è così??
    Esatto.
    @kaumi

    La funzione che ti ho appena scritto qui sotto riportata fa esattamente il lavoro che chiedi.
    L'unica cosa è che io l'ho implementata nella maniera tale che prende come argomento una stringa di caratteri e lavora su quella, editandola come hai bisogno tu.. Ti posto il programma di esempio:
    Stringa presa da "file.txt"
    I\nam\na\nstrange\nstring
    Program
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void replace_nwline(char s[], int N)
    {
    	int i = 0, i2 = 0;
    	char tmp;
    	
    	while(i < N)
    	{
    		if(s[i] == 92 && s[i + 1] == 110) 
    		{
    			s[i] = 10;
    
    			for(i2 = i; i2 < N; i2++)
    			{
    				tmp = s[i2 + 2];
    				s[i2 + 1] = tmp;
    			}
    		}
    		i++;	
    	}
    }		
    	
    int main()
    {
    	int i = 0;
    	char s[200], filename[] = "file.txt";
    	FILE *file = NULL;
    	
    	if(file = fopen(filename, "r"))
    	{
    		while(!ferror(file) && !feof(file))
    		{
    			s[i] = fgetc(file);
    			i++;
    		}
    	}
    	else
    	{
    		perror(filename);
    		exit(1);
    	}
    		
    	s[i - 2] = 0;
    
    	printf("\n*~ String from file:\n%s\n\n", s);
    	replace_nwline(s, strlen(s));
    	printf("*~ String now is:\n%s\n\n", s);
    	
    	return 0;
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Grazie mille! Funziona perfettamente
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.