PyariBilli
PyariBilli

Reputation: 531

How to read a multi line using fscanf

I want to read my data.txt file which looks like and store it in an array called buffer[i][j]

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4

I am writing a code which looks like

#include"stdio.h"
#include"stdlib.h"

int main() {

  FILE *fp1;
  int i,j;

  int buffer[4][4]={0};

  fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      fscanf(fp1,"%d", &buffer[i][j]);
    }
    // fscanf(fp1,"\n");
  }
  fclose(fp1);

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      printf("%d ",buffer[i][j]);
    }
    printf("\n");
  }
}

but i get the output...

1 1 2 1

5 1 6 1

17 1 18 1

21 1 22 1

why????

Upvotes: 1

Views: 18343

Answers (4)

yulian
yulian

Reputation: 1627

To get required output (1111,2222,...) change:

fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

to:

fp1 = fopen("data.txt","r");

Clarification: when using fopen you should write the name of file you want to read. In you case you have to write data.txt, not exact_enumerated_config_442_cub_mc... There is no file with this name, moreover there is no any data like 1 1 1 1, 2 2 2 2, 3 3 3 3, 4 4 4 4...

For more detailes visit:
wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen


Here is your "modified" (excess/waste/extra { } removed and data.txt is written) code that gives you required output: 1 1 1 1, 2 2 2 2, 3 3 3 3, 4 4 4 4. It prints the array named buffer. It means that...

...data was successfully copied! from "data.txt" to buffer[4][4]:

#include"stdio.h"
#include"stdlib.h"

int main()
{
    FILE *fp1;
    int i,j;

    int buffer[4][4];

    for ( i = 0; i < 4; i++ )
        for ( j = 0; j < 4; j++ )
            buffer[i][j] = 0;


    fp1 = fopen("data.txt","r");

    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            fscanf(fp1,"%d", &buffer[i][j]);

    fclose(fp1);


    for(i=0; i<4; i++)
    {
        for(j=0; j<4; j++)
            printf("%d ",buffer[i][j]);
        printf("\n");
    }

return 0;
}

P.S.

If data.txt will contain not

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

but

1 1 1    1
2   2   2 2
3       3 3 3
4 444    // the last two elements are absent

the program will read 1-st, 2-nd and 3-rd line properly, and the output of the 4-th line will be

4 444 0 0 

It prints 4, then 444, and then 0 and 0: the last two elements are '0's because buffer had been initialized by zeros, so all elements changed their values, but the last two remained to be zeros.

Upvotes: 1

Aatish Sai
Aatish Sai

Reputation: 3

You have said you want to read data.txt then why are you opening the file exact_enumerated_config_442_cub_mc

Try changing this

fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

to

fp1 = fopen("data.txt","r");

Upvotes: 0

hmjd
hmjd

Reputation: 121971

  • Always check the result of fopen() to ensure the file has been opened.
  • Always check the result of fscanf() to ensure it was successful and prevent subsequent code processing variables that may not have been assigned a value (it returns the number of assignments made).
  • Add a leading space character to the format specifier to skip whitespace, including newline characters: " %d".

The code will treat a single line with sixteen ints the same as four lines with four ints. If it is important that the format of the file is four ints per line then read a single line using fgets() and then use sscanf() to extract the ints with the %n format specifier to ensure full buffer was processed:

int ints[4][4] = { { 0 } };
char buffer[1024];
for (int i = 0; i < 4 && fgets(buffer, 1024, fp); i++)
{
    int pos;
    if (sscanf(buffer,
               "%d %d %d %d%n",
               &ints[i][0],
               &ints[i][1],
               &ints[i][2],
               &ints[i][3],
               &pos) != 4 || pos != strlen(buffer) - 1)
    {
        fprintf(stderr, "Invalid format: <%s>\n", buffer);
        exit(1);
    }
}

Upvotes: 4

MOHAMED
MOHAMED

Reputation: 43528

Add space at the beginning of the string format it should be " %d" to avoid the newline problems

fscanf(fp1," %d", &buffer[i][j]);

BTW you could use the following code instead

for(i=0;i<4;i++) {
   fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}

Upvotes: 1

Related Questions