Εμφάνιση 1-3 από 3
  1. #1
    Εγγραφή
    05-03-2014
    Μηνύματα
    1
    Downloads
    0
    Uploads
    0
    ISP
    Forthnet
    Καλησπέρα, θα ήθελα παρακαλώ να μου πείτε πως θα μπορούσα να εισάγω δεδομένα από txt αρχείο σε ένα πίνακα. Ψάχνω από το πρωί και αυτό που έχω καταλάβει είναι πως να δημιουργώ ένα αρχείο με την εντολή fopen αλλά δεν καταλαβαίνω πως να τα εισάγω στο πρόγραμμα μου. Έστω ένα αρχείο A.txt που έχει στοιχεία
    1 2 3
    4 5 6
    7 8 9

    και θέλω να το χρησιμοποιήσω στο πρόγραμμα με τη μεταβλητή a.

    Παρακαλώ πολύ μπορείτε να μου πείτε πως γίνεται? Βρήκα διάφορα στο Internet και έχω μπερδευτεί. Δοκίμασα κάτι αλλά δε δουλεύει.Αν γνωρίζει κάποιος ένα βιβλίο που να έχει παραδείγματα σε αυτό που ζητάω παρακαλώ ενημερώστε με.

    #include<stdio.h>
    #include "stdafx.h"
    #include<stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <omp.h>
    using namespace std;
    #define x1file "A"


    int main()
    {

    FILE *fpx1;
    double a[3][3];

    if ( (fpx1=fopen(x1file, "r")) == NULL)
    {
    fprintf(stderr, "\n Error opening file! %s. \n", x1file);
    }

    for(int i = 0; i < 3; i++)
    {
    for(int j = 0; j < 3; j++)
    {
    x1file >> a[i][j];
    }
    }


    fclose(fpx1);

    return 0;
    }

    Ευχαριστώ πολύ.

  2. #2
    Εγγραφή
    22-11-2002
    Ηλικία
    37
    Μηνύματα
    4.198
    Downloads
    3
    Uploads
    0
    Ταχύτητα
    17500/1024
    DSLAM
    Tellas - ΚΟΛΟΝΟΣ
    http://www.tutorialspoint.com/c_stan...tion_fgets.htm

    Βοηθάει αυτό αντί να τραβάς ένα χαρακτήρα κάθε φορά;


    Επίσης μην ξεχνάς ότι και τα κενά θεωρούνται char αν έχεις κενά στο txt

    Άκυρο τώρα είδα ότι θες να τα περάσεις σε πίνακα
    όταν ορίζεις ως στααθερή το αρχείο σου δεν έπρεπε να έχει και το .txt ?
    Χρησιμοποιείς bitshift operator επίσης
    Τελευταία επεξεργασία από το μέλος JediMasterMANIAC : 07-03-14 στις 05:42.
    Χρησιμοποιώ Arch Linux. Εσύ; Δοκίμασε το δεν χάνεις και τίποτα :)
    Live CDs χωρίς να βγάλεις τα Windows: Ubuntu, OpenSUSE, Fedora.
    Για πιο ολοκληρωμένη άποψη συνιστάται εγκατάσταση και αρκετή χρήση. Το Linux ΔΕΝ είναι Windows :)
    Τί είναι το Linux ; δες εδώ και εδώ

    Paintball team Last Chancers

  3. #3
    Εγγραφή
    20-11-2006
    Ηλικία
    56
    Μηνύματα
    797
    Downloads
    0
    Uploads
    0
    Ταχύτητα
    14566/1006
    ISP
    HOL
    DSLAM
    HOL - ΑΘΗΝΑ
    Router
    Pirelli (λευκό)
    SNR / Attn
    9(dB) / 15(dB)
    Path Level
    Interleaved
    Παράθεση Αρχικό μήνυμα από anastasia_ Εμφάνιση μηνυμάτων
    Καλησπέρα, θα ήθελα παρακαλώ να μου πείτε πως θα μπορούσα να εισάγω δεδομένα από txt αρχείο σε ένα πίνακα. Ψάχνω από το πρωί και αυτό που έχω καταλάβει είναι πως να δημιουργώ ένα αρχείο με την εντολή fopen αλλά δεν καταλαβαίνω πως να τα εισάγω στο πρόγραμμα μου. Έστω ένα αρχείο A.txt που έχει στοιχεία
    1 2 3
    4 5 6
    7 8 9

    και θέλω να το χρησιμοποιήσω στο πρόγραμμα με τη μεταβλητή a.

    Παρακαλώ πολύ μπορείτε να μου πείτε πως γίνεται? Βρήκα διάφορα στο Internet και έχω μπερδευτεί. Δοκίμασα κάτι αλλά δε δουλεύει.Αν γνωρίζει κάποιος ένα βιβλίο που να έχει παραδείγματα σε αυτό που ζητάω παρακαλώ ενημερώστε με.

    [snip κώδικας]

    Ευχαριστώ πολύ.
    Ο κώδικας που έχεις παραθέσει είναι συνονθύλευμα από C και C++. Για παράδειγμα, ανοίγεις (και κλείνεις) το αρχείο σου με C αλλά μετά προσπαθείς να διαβάσεις τα περιεχόμενά του στον πίνακα με C++ (εκεί που ο JediMasterMANIAC νόμιζε πως επιχειρείς shift operation).

    Τα #include που έχεις συμπεριλάβει στον κώδικά σου υποδηλώνουν πως μάλλον θέλεις να το κάνεις με C++, αλλά στον τίτλο του νήματος ρωτάς για C. Οπότε δεν μου είναι ξεκάθαρο τελικά σε ποια γλώσσα από τις 2 θέλεις να γράψεις τον κώδικα.

    Η C++ είναι μερικό υπερσύνολο της C, αλλά δεν είναι ακριβές υπερσύνολο, οπότε είναι καλή ιδέα να γράψεις τον κώδικα είτε με πρακτικές C είτε με πρακτικές C++.

    Θα σου παραθέσω παραπλήσιες υλοποιήσεις και στις 2 γλώσσες, κι από εκεί και πέρα αποφάσισε εσύ ποια θα χρησιμοποιήσεις.

    Αλγοριθμικά, διαβάζω το αρχείο σειριακά με ένα μόνο loop (αντί δηλαδή για 2 nested loops) το οποίο έχει για control variable το n. Αυτό σημαίνει πως πρέπει στο σώμα του loop να μετατρέψω την εκάστοτε τιμή του n στην αντίστοιχη γραμμή και στήλη του πίνακα. Το κάνω με τα macros ROW_OF(n) και COL_OF(n). Εσύ όμως αν θέλεις, μπορείς να χρησιμοποιήσεις 2 nested loops για το διάβασμα (όπως κάνεις στον κώδικα που παρέθεσες). Στη συνάρτηση που τυπώνω τα στοιχεία του πίνακα, χρησιμοποιώ κι εγώ 2 nested loops.

    Δεν έχω βάλει σχόλια, αφενός γιατί για κάποιον έμπειρο δεν πολυ-χρειάζονται, και αφετέρου γιατί αν πρόκειται για εργασία τότε να αναγκαστείς να βρεις μόνη/ος σου πως ακριβώς δουλεύει, και να τα βάλεις εσύ, και άρα να μπορείς να το υποστηρίξεις σε τυχόν προφορική εξέταση (και άρα, το σημαντικότερο, να σου έχουν μείνει και 2-3 πράγματα ).

    Κώδικας C++
    Κώδικας:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    
    #define X1FILE     "anastasia.txt"
    
    #define NCOLS      3
    #define NROWS      3
    #define N          (NROWS) * (NCOLS)
    
    #define ROW_OF(n)  (n) / NCOLS
    #define COL_OF(n)  (n) % NCOLS
    
    /*********************************************************//**
     *
     ************************************************************/
    void a_print( int a[NROWS][NCOLS] )
    {
    	if ( !a ) {
    		std::cerr <<  "*** a_print(): Invalid a\n";
    		return;
    	}
    
    	for (int i=0; i < NROWS; i++) {
    		for (int j=0; j < NCOLS; j++) {
    			std::cout << a[i][j];
    		}
    		std::cout << std::endl;
    	}
    }
    
    /*********************************************************//**
     *
     ************************************************************/
    int main( void )
    {
    	int n               = 0;
    	int a[NROWS][NCOLS] = {{0,0}};
    	std::ifstream ifsx1(X1FILE);
    
    	if ( !ifsx1.is_open() ) {
    		std::cerr << "*** Error opening file: " << X1FILE << ", bye...\n";
    		exit( EXIT_FAILURE );
    	}
    
    	for (n=0; n < N; n++) {
    		if ( ! (ifsx1 >> a[ROW_OF(n)][COL_OF(n)]) )
    			break;
    	}
    	ifsx1.close();
    
    	if ( N != n )
    	{
    		std::cout
    			<< "Only " << n << " numbers out of the expected "
    			<< N << " were found in file '" << X1FILE << "'.\n"
    			<< "The remaining " << N-n
    			<< " element(s) of the array were set to 0.\n\n"
    			;
    	}
    
    	a_print( a );
    
    	exit( EXIT_SUCCESS );
    }
    Κώδικας C:
    Κώδικας:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define X1FILE     "anastasia.txt"
    
    #define NCOLS      3
    #define NROWS      3
    #define N          (NROWS) * (NCOLS)
    
    #define ROW_OF(n)  (n) / NCOLS
    #define COL_OF(n)  (n) % NCOLS
    
    /*********************************************************//**
     *
     ************************************************************/
    void a_print( int a[NROWS][NCOLS] )
    {
    	if ( !a ) {
    		fputs( "*** a_print(): Invalid a\n", stderr );
    		return;
    	}
    
    	for (int i=0; i < NROWS; i++) {
    		for (int j=0; j < NCOLS; j++) {
    			printf( "%d", a[i][j] );
    		}
    		putchar('\n');
    	}
    }
    
    /*********************************************************//**
     *
     ************************************************************/
    int main( void )
    {
    	int n               = 0;
    	int a[NROWS][NCOLS] = {{0,0}};
    	FILE *fpx1          = fopen(X1FILE, "r");
    
    	if ( !fpx1 ) {
    		fprintf(stderr, "*** Error opening file: %s, bye...\n", X1FILE);
    		exit( EXIT_FAILURE );
    	}
    
    	for (n=0; n < N; n++) {
    		if ( 1 != fscanf(fpx1, "%d", &a[ROW_OF(n)][COL_OF(n)]) )
    			break;
    	}
    	fclose( fpx1 );
    
    	if ( N != n )
    	{
    		printf(
    			"Only %d numbers out of the expected %d were found in file '%s'.\n"
    			"The remaining %d element(s) of the array were set to 0.\n\n",
    			n, N, X1FILE,
    			N-n
    			);
    	}
    
    	a_print( a );
    
    	exit( EXIT_SUCCESS );
    }
    ΥΓ. Αναφορικά με τον κώδικα σε C++, αν έχεις C++11 compiler και γνωρίζεις από templates, template aliases, κλπ μπορείς να χρησιμοποιήσεις και την κλάση std::array για τον πίνακά σου, αλλά είναι λίγο too much κατά την άποψή μου (εδώ ένα σχετικά διαφωτιστικό άρθρο: http://cpptruths.blogspot.gr/2011/10...ys-in-c11.html).

    Επίσης, σε C++ χρήση του προ-επεξεργαστή αποθαρρύνεται, οπότε ίσως είναι καλή ιδέα να αλλάξεις τις σταθερές σε const, και τα macros σε συναρτήσεις.
    Τελευταία επεξεργασία από το μέλος migf1 : 07-03-14 στις 17:37.

Παρόμοια Θέματα

  1. Μηνύματα: 5
    Τελευταίο Μήνυμα: 20-11-13, 03:02
  2. ένωση πολλών mp3 σε ένα αρχείο mp3 (με εντολή στο lame ίσως)
    Από JULIANIK στο φόρουμ Audio, Video και Φωτογραφία
    Μηνύματα: 3
    Τελευταίο Μήνυμα: 12-11-13, 01:00
  3. απορια με ασκηση στη c
    Από vovosm7 στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 2
    Τελευταίο Μήνυμα: 06-04-13, 12:51
  4. Βοήθεια σε άσκηση στη C
    Από theoo στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμού
    Μηνύματα: 6
    Τελευταίο Μήνυμα: 08-03-13, 22:40

Tags για αυτό το Θέμα

Bookmarks

Bookmarks

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύσετε νέα θέματα
  • Δεν μπορείτε να δημοσιεύσετε νέα μηνύματα
  • Δεν μπορείτε να αναρτήσετε συνημμένα
  • Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας
  •  
  • Τα BB code είναι σε λειτουργία
  • Τα Smilies είναι σε λειτουργία
  • Το [IMG] είναι σε λειτουργία
  • Το [VIDEO] είναι σε λειτουργία
  • Το HTML είναι εκτός λειτουργίας