Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Acquisizione da file riga per riga

    Ciao ragazzi non riesco a risolvere un problema. Ho bisogno di acquisire in un array tutti i valori di ogni riga di caratteri. Esempio del file :

    asdasfaj21jioj3io4hji13uh4iu1h4i1u
    1hj3uio2j3oi1jio3jio1j24iojoi1j4io1j
    h1jui4hj1uiohjio4jio1j2ioj4oj1oij4j4f


    In pratica vorrei avere nell' array[1] la prima riga array[2] la seconda, etc.
    Quale funzione mi consigliate di usare iostream o fopen?

    Io quando tento di fare l'acquisizione, mi mette invece che l'intera riga nell'array[1], solo il primi carattere della prima riga, nell'array[²] il secondo cattere, etc.
    La curiosità è la fonte della conoscenza.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    fopen serve ad aprire un file in C ... iostream è una libreria ...

    Usa la getline

    http://www.cplusplus.com/reference/i...tream/getline/
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Grazie, ha funzionato.
    Ho scritto queste righe di codice, non mi da errore in compilazione, ma quando eseguo mi da sempre un Segmentation Fault che non riesco a capire dove è l'errore...

    codice:
    #include <iostream>
    #include <fstream>
    #include <string.h>
    #define DBSIZE 703
    #define SELECTSIZE 47
    
    using namespace std;
    
    int main(){
    
    	string bufferSelect[SELECTSIZE], bufferDB[DBSIZE];
    	int a=0, b=0, test=0,i,y;
    
    	ifstream buffer("selectdb.txt", ios::in);
    	ifstream buffer2("DB2.txt", ios::in);
    
    // Acquisisco ogni riga di selectdb.txt e metto in bufferSelect
    	if (buffer){
    		for(i=0; i<SELECTSIZE; i++)
    			 getline(buffer,bufferSelect[i]);
    	}
    	i=0;
    // Acquisisco ogni riga di DB2.txt e metto in bufferDB
    	if (buffer2){
    		for(y=0; y<DBSIZE; y++){
    			getline(buffer2,bufferDB[y]);
    			cout << y << " -> "<< bufferDB[y] << "\n" << endl;
    		}
    	}
    	y=0;
    // Verifico che DB2 contenga tutto selectdb
    	for ( i; i<SELECTSIZE; i++)
    		for ( y; y<DBSIZE; y++){
    			if (bufferSelect[i] == bufferDB[y]){
    					break;
    			}else{
    				ofstream risultato("risultato.txt", ios::out);
    				risultato << bufferSelect[y] << "\n";
    			}
    		}
    	return 0;
    }
    Voi cosa ne dite?
    La curiosità è la fonte della conoscenza.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Cosa intendi con

    string bufferSelect[SELECTSIZE], bufferDB[DBSIZE];

    ?

    Use gli oggetti string del C++ come fossero stringhe del C ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    E' parecchio tempo che non programmo e certe cose me le sono dimenticate
    Solo ora ricordo che il tipo string era del C, ma fondamentalmente l'ho utilizzato perchè quando ho provato a mettere char, durante la compilazione ottenevo questi errori e non sono riuscito a venirne fuori tranne che con "string":


    main.cpp:20: error: invalid conversion from ‘void*’ to ‘char**’
    main.cpp:20: error: invalid conversion from ‘char’ to ‘size_t*’
    /usr/include/stdio.h:651: error: too few arguments to function ‘__ssize_t getline(char**, size_t*, FILE*)’
    main.cpp:20: error: at this point in file
    main.cpp:26: error: invalid conversion from ‘void*’ to ‘char**’
    main.cpp:26: error: invalid conversion from ‘char’ to ‘size_t*’
    /usr/include/stdio.h:651: error: too few arguments to function ‘__ssize_t getline(char**, size_t*, FILE*)’
    main.cpp:26: error: at this point in file


    E' li il problema? devo utilizzare un'altro tipo per i miei due array? Quale?
    La curiosità è la fonte della conoscenza.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Un attimo ... va bene con il vettore di string ma quando ti capita il Segmentation Fault ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Dal debug sono riuscito a vedere un paio di cose, la prima è questo messaggio di errore che mi appare in shell dopo che eseguo le due getline di acquisizione :

    &"warning: GDB: Failed to set controlling terminal: Funzione non permessa\n"


    Dopo l'acquisizione invece in questa parte del codice :

    codice:
    // Verifico che DB2 contenga tutto selectdb
    	for ( i; i<SELECTSIZE; i++)
    		for ( y; y<DBSIZE; y++){
    			if (bufferSelect[i] == bufferDB[y]){
    					break;
    			}else{
    				ofstream risultato("risultato.txt", ios::out);
    				risultato << bufferSelect[y] << "\n";
    			}
    		}
    Mi esce il popup del Segmentation Fault.
    Volevo chiedervi se vi sembravano corrette le mie getline (anche dal punto di vista del tipo di variabili che acquisiscono) e se i cicli annidati potevano andare bene.



    Il problema sostanzialmente deve verificare che in 2 file contenenti righe di testo.
    Che il file A (703 righe) contenga tutto il file B (47 righe) nel caso in cui mancasse qualche riga, deve scriverla sul file "risultato.txt"
    La curiosità è la fonte della conoscenza.

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.