Fill a 2d array from a file in C [duplicate]












1
















This question is an exact duplicate of:




  • fscanf into a 2d array in C

    2 answers




So i have a 20 x 20 array, and its all filled with -1.
I also have an input.txt which contains some numbers, for example :

2,3

5,6



How can i fill my array so that array[0][0] will be 2,
array[0][1] will be 3, array[1][0] will be 5, array[1][1] will be 6, and every other element will be -1.



I've tried with a for loop thats using fscanf until there is a new line, but that won't work.










share|improve this question













marked as duplicate by user1118321, Jean-François Fabre c
Users with the  c badge can single-handedly close c questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 27 '18 at 20:20


This question was marked as an exact duplicate of an existing question.














  • 1





    Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

    – Some programmer dude
    Nov 24 '18 at 16:21






  • 1





    "I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

    – chux
    Nov 24 '18 at 16:30








  • 1





    How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

    – chux
    Nov 24 '18 at 16:31


















1
















This question is an exact duplicate of:




  • fscanf into a 2d array in C

    2 answers




So i have a 20 x 20 array, and its all filled with -1.
I also have an input.txt which contains some numbers, for example :

2,3

5,6



How can i fill my array so that array[0][0] will be 2,
array[0][1] will be 3, array[1][0] will be 5, array[1][1] will be 6, and every other element will be -1.



I've tried with a for loop thats using fscanf until there is a new line, but that won't work.










share|improve this question













marked as duplicate by user1118321, Jean-François Fabre c
Users with the  c badge can single-handedly close c questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 27 '18 at 20:20


This question was marked as an exact duplicate of an existing question.














  • 1





    Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

    – Some programmer dude
    Nov 24 '18 at 16:21






  • 1





    "I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

    – chux
    Nov 24 '18 at 16:30








  • 1





    How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

    – chux
    Nov 24 '18 at 16:31
















1












1








1









This question is an exact duplicate of:




  • fscanf into a 2d array in C

    2 answers




So i have a 20 x 20 array, and its all filled with -1.
I also have an input.txt which contains some numbers, for example :

2,3

5,6



How can i fill my array so that array[0][0] will be 2,
array[0][1] will be 3, array[1][0] will be 5, array[1][1] will be 6, and every other element will be -1.



I've tried with a for loop thats using fscanf until there is a new line, but that won't work.










share|improve this question















This question is an exact duplicate of:




  • fscanf into a 2d array in C

    2 answers




So i have a 20 x 20 array, and its all filled with -1.
I also have an input.txt which contains some numbers, for example :

2,3

5,6



How can i fill my array so that array[0][0] will be 2,
array[0][1] will be 3, array[1][0] will be 5, array[1][1] will be 6, and every other element will be -1.



I've tried with a for loop thats using fscanf until there is a new line, but that won't work.





This question is an exact duplicate of:




  • fscanf into a 2d array in C

    2 answers








c arrays






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 24 '18 at 16:17









Stan MarshStan Marsh

216




216




marked as duplicate by user1118321, Jean-François Fabre c
Users with the  c badge can single-handedly close c questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 27 '18 at 20:20


This question was marked as an exact duplicate of an existing question.









marked as duplicate by user1118321, Jean-François Fabre c
Users with the  c badge can single-handedly close c questions as duplicates and reopen them as needed.

StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;

$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');

$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 27 '18 at 20:20


This question was marked as an exact duplicate of an existing question.










  • 1





    Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

    – Some programmer dude
    Nov 24 '18 at 16:21






  • 1





    "I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

    – chux
    Nov 24 '18 at 16:30








  • 1





    How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

    – chux
    Nov 24 '18 at 16:31
















  • 1





    Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

    – Some programmer dude
    Nov 24 '18 at 16:21






  • 1





    "I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

    – chux
    Nov 24 '18 at 16:30








  • 1





    How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

    – chux
    Nov 24 '18 at 16:31










1




1





Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

– Some programmer dude
Nov 24 '18 at 16:21





Please read the help pages, especially "What topics can I ask about here?" and "What types of questions should I avoid asking?". Also take the tour and read about how to ask good questions and this question checklist. Lastly learn how to create a Minimal, Complete, and Verifiable example.

– Some programmer dude
Nov 24 '18 at 16:21




1




1





"I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

– chux
Nov 24 '18 at 16:30







"I've tried with a for loop thats using fscanf until there is a new line, but that won't work." --> Post that code and explain how it did not work. Post a Minimal, Complete, and Verifiable example

– chux
Nov 24 '18 at 16:30






1




1





How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

– chux
Nov 24 '18 at 16:31







How did stackoverflow.com/q/53436800/2410359 not work for you? That question is still open.

– chux
Nov 24 '18 at 16:31














2 Answers
2






active

oldest

votes


















0















I've tried with a for loop thats using fscanf until there is a new line, but that won't work.




Variations on fscanf(in, "%d,%dn", &x, &y), as in OP's prior question, fail to detect end-of-line. The 'n' in the format will match any white-space on input including 'n', ' ', 't',etc.



Simplistic usage of fscanf(..., "%d",...) can readily fail as "%d" will consume all leading white-space with no discrimination between 'n' and other white-spaces.




How can i fill my array ...




Although possible to use fscanf() to solve this task, consider fgets(), strtol().



The best approach is to use fgets() to reach a line: all characters up to and including the one final 'n'. Then use strtol(), strtoll(), etc. to read the integers.



long integers and spacing each needs reasonable less than 21 characters. To accommodate extra leading zeros spacing, etc, let use 2x the anticipated size needs.



#define CHAR_PER_NUMBER 21
#define NUM_PER_LINE 20
#define LINE_NUM 20
#define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

long array[LINE_NUM][NUM_PER_LINE];

// read data
for (int i = 0; i < LINE_NUM; i++) {
char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
if (fgets(buf, sizeof buf, in) == NULL) {
buf[0] = '';
}
// Now parse the line
char *p = buf;
for (int j = 0; j < NUM_PER_LINE; j++) {
char *endptr;
array[i][j] = strtol(p, &endptr, 10);
if (p == endptr) {
array[i][j] = -1; // no conversion
}
p = endptr; // advance to the next number
}
}


Additional concerns including handling pathological long lines, values outside the long range, I/O error handling and efficiency details.



Should input consists of text representing floating-point, a more generous max size per value is warranted.






share|improve this answer































    0














    Try using "end of file"(eof), where m and n are the rows and columns



    for (i = 0; i < m && !feof(input); i++)
    for (j = 0; j < n && !feof(input); j++)
    fscanf(input, "%f", &a[i][j]);


    If the size of the array (m and n) is also given in the file write an if condition before



    if (!feof(input))
    fscanf(input, "%d %d", &m, &n);
    for (i = 0; i < m && !feof(input); i++)
    for (j = 0; j < n && !feof(input); j++)
    fscanf(input, "%f", &a[i][j]);





    share|improve this answer



















    • 1





      Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

      – chux
      Nov 24 '18 at 16:45




















    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0















    I've tried with a for loop thats using fscanf until there is a new line, but that won't work.




    Variations on fscanf(in, "%d,%dn", &x, &y), as in OP's prior question, fail to detect end-of-line. The 'n' in the format will match any white-space on input including 'n', ' ', 't',etc.



    Simplistic usage of fscanf(..., "%d",...) can readily fail as "%d" will consume all leading white-space with no discrimination between 'n' and other white-spaces.




    How can i fill my array ...




    Although possible to use fscanf() to solve this task, consider fgets(), strtol().



    The best approach is to use fgets() to reach a line: all characters up to and including the one final 'n'. Then use strtol(), strtoll(), etc. to read the integers.



    long integers and spacing each needs reasonable less than 21 characters. To accommodate extra leading zeros spacing, etc, let use 2x the anticipated size needs.



    #define CHAR_PER_NUMBER 21
    #define NUM_PER_LINE 20
    #define LINE_NUM 20
    #define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

    long array[LINE_NUM][NUM_PER_LINE];

    // read data
    for (int i = 0; i < LINE_NUM; i++) {
    char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
    if (fgets(buf, sizeof buf, in) == NULL) {
    buf[0] = '';
    }
    // Now parse the line
    char *p = buf;
    for (int j = 0; j < NUM_PER_LINE; j++) {
    char *endptr;
    array[i][j] = strtol(p, &endptr, 10);
    if (p == endptr) {
    array[i][j] = -1; // no conversion
    }
    p = endptr; // advance to the next number
    }
    }


    Additional concerns including handling pathological long lines, values outside the long range, I/O error handling and efficiency details.



    Should input consists of text representing floating-point, a more generous max size per value is warranted.






    share|improve this answer




























      0















      I've tried with a for loop thats using fscanf until there is a new line, but that won't work.




      Variations on fscanf(in, "%d,%dn", &x, &y), as in OP's prior question, fail to detect end-of-line. The 'n' in the format will match any white-space on input including 'n', ' ', 't',etc.



      Simplistic usage of fscanf(..., "%d",...) can readily fail as "%d" will consume all leading white-space with no discrimination between 'n' and other white-spaces.




      How can i fill my array ...




      Although possible to use fscanf() to solve this task, consider fgets(), strtol().



      The best approach is to use fgets() to reach a line: all characters up to and including the one final 'n'. Then use strtol(), strtoll(), etc. to read the integers.



      long integers and spacing each needs reasonable less than 21 characters. To accommodate extra leading zeros spacing, etc, let use 2x the anticipated size needs.



      #define CHAR_PER_NUMBER 21
      #define NUM_PER_LINE 20
      #define LINE_NUM 20
      #define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

      long array[LINE_NUM][NUM_PER_LINE];

      // read data
      for (int i = 0; i < LINE_NUM; i++) {
      char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
      if (fgets(buf, sizeof buf, in) == NULL) {
      buf[0] = '';
      }
      // Now parse the line
      char *p = buf;
      for (int j = 0; j < NUM_PER_LINE; j++) {
      char *endptr;
      array[i][j] = strtol(p, &endptr, 10);
      if (p == endptr) {
      array[i][j] = -1; // no conversion
      }
      p = endptr; // advance to the next number
      }
      }


      Additional concerns including handling pathological long lines, values outside the long range, I/O error handling and efficiency details.



      Should input consists of text representing floating-point, a more generous max size per value is warranted.






      share|improve this answer


























        0












        0








        0








        I've tried with a for loop thats using fscanf until there is a new line, but that won't work.




        Variations on fscanf(in, "%d,%dn", &x, &y), as in OP's prior question, fail to detect end-of-line. The 'n' in the format will match any white-space on input including 'n', ' ', 't',etc.



        Simplistic usage of fscanf(..., "%d",...) can readily fail as "%d" will consume all leading white-space with no discrimination between 'n' and other white-spaces.




        How can i fill my array ...




        Although possible to use fscanf() to solve this task, consider fgets(), strtol().



        The best approach is to use fgets() to reach a line: all characters up to and including the one final 'n'. Then use strtol(), strtoll(), etc. to read the integers.



        long integers and spacing each needs reasonable less than 21 characters. To accommodate extra leading zeros spacing, etc, let use 2x the anticipated size needs.



        #define CHAR_PER_NUMBER 21
        #define NUM_PER_LINE 20
        #define LINE_NUM 20
        #define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

        long array[LINE_NUM][NUM_PER_LINE];

        // read data
        for (int i = 0; i < LINE_NUM; i++) {
        char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
        if (fgets(buf, sizeof buf, in) == NULL) {
        buf[0] = '';
        }
        // Now parse the line
        char *p = buf;
        for (int j = 0; j < NUM_PER_LINE; j++) {
        char *endptr;
        array[i][j] = strtol(p, &endptr, 10);
        if (p == endptr) {
        array[i][j] = -1; // no conversion
        }
        p = endptr; // advance to the next number
        }
        }


        Additional concerns including handling pathological long lines, values outside the long range, I/O error handling and efficiency details.



        Should input consists of text representing floating-point, a more generous max size per value is warranted.






        share|improve this answer














        I've tried with a for loop thats using fscanf until there is a new line, but that won't work.




        Variations on fscanf(in, "%d,%dn", &x, &y), as in OP's prior question, fail to detect end-of-line. The 'n' in the format will match any white-space on input including 'n', ' ', 't',etc.



        Simplistic usage of fscanf(..., "%d",...) can readily fail as "%d" will consume all leading white-space with no discrimination between 'n' and other white-spaces.




        How can i fill my array ...




        Although possible to use fscanf() to solve this task, consider fgets(), strtol().



        The best approach is to use fgets() to reach a line: all characters up to and including the one final 'n'. Then use strtol(), strtoll(), etc. to read the integers.



        long integers and spacing each needs reasonable less than 21 characters. To accommodate extra leading zeros spacing, etc, let use 2x the anticipated size needs.



        #define CHAR_PER_NUMBER 21
        #define NUM_PER_LINE 20
        #define LINE_NUM 20
        #define LINE_SIZE (NUM_PER_LINE * CHAR_PER_NUMBER * 2)

        long array[LINE_NUM][NUM_PER_LINE];

        // read data
        for (int i = 0; i < LINE_NUM; i++) {
        char buf[LINE_SIZE + 1]; // +1: room for the appended the null character
        if (fgets(buf, sizeof buf, in) == NULL) {
        buf[0] = '';
        }
        // Now parse the line
        char *p = buf;
        for (int j = 0; j < NUM_PER_LINE; j++) {
        char *endptr;
        array[i][j] = strtol(p, &endptr, 10);
        if (p == endptr) {
        array[i][j] = -1; // no conversion
        }
        p = endptr; // advance to the next number
        }
        }


        Additional concerns including handling pathological long lines, values outside the long range, I/O error handling and efficiency details.



        Should input consists of text representing floating-point, a more generous max size per value is warranted.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 24 '18 at 21:04









        chuxchux

        83.4k872152




        83.4k872152

























            0














            Try using "end of file"(eof), where m and n are the rows and columns



            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);


            If the size of the array (m and n) is also given in the file write an if condition before



            if (!feof(input))
            fscanf(input, "%d %d", &m, &n);
            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);





            share|improve this answer



















            • 1





              Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

              – chux
              Nov 24 '18 at 16:45


















            0














            Try using "end of file"(eof), where m and n are the rows and columns



            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);


            If the size of the array (m and n) is also given in the file write an if condition before



            if (!feof(input))
            fscanf(input, "%d %d", &m, &n);
            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);





            share|improve this answer



















            • 1





              Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

              – chux
              Nov 24 '18 at 16:45
















            0












            0








            0







            Try using "end of file"(eof), where m and n are the rows and columns



            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);


            If the size of the array (m and n) is also given in the file write an if condition before



            if (!feof(input))
            fscanf(input, "%d %d", &m, &n);
            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);





            share|improve this answer













            Try using "end of file"(eof), where m and n are the rows and columns



            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);


            If the size of the array (m and n) is also given in the file write an if condition before



            if (!feof(input))
            fscanf(input, "%d %d", &m, &n);
            for (i = 0; i < m && !feof(input); i++)
            for (j = 0; j < n && !feof(input); j++)
            fscanf(input, "%f", &a[i][j]);






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 24 '18 at 16:38









            Marko PanushkovskiMarko Panushkovski

            111




            111








            • 1





              Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

              – chux
              Nov 24 '18 at 16:45
















            • 1





              Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

              – chux
              Nov 24 '18 at 16:45










            1




            1





            Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

            – chux
            Nov 24 '18 at 16:45







            Why is “while ( !feof (file) )” always wrong? is a useful read here. Better to check the return value of fscanf().

            – chux
            Nov 24 '18 at 16:45





            Popular posts from this blog

            Wiesbaden

            Marschland

            Dieringhausen