Reading text file and storing columns in an array

你离开我真会死。 提交于 2020-06-16 04:34:13

问题


I have file that looks like this:

01 01 5.00 1.50 7.50
02 01 4.00 3.00 12.00
02 02 3.00 4.00 12.00
03 01 4.50 3.00 13.50
03 01 7.50 2.50 18.75
03 01 6.00 0.50 3.00 
04 01 2.00 3.00 6.00 
04 02 2.00 3.00 6.00
05 01 1.50 3.00 4.50
07 01 5.00 1.00 5.00
09 01 1.50 6.00 9.00

I am trying to read each line and store each column of data into separate arrays. Something like this:

int A[100] = {1, 2, 2, 3, 3, 3, 4, 4, 5, 7, 9}
int B[100] = {1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1}
double C[100] = {5.00, 4.00, 3.00, 4.50, 7.50, 6.00, 2.00, 2.00, 1.50, 5.00, 1.50}
double D[100] = {1.50, 3.00, 4.00, 3.00, 2.50, 0.50, 3.00, 3.00, 3.00, 1.00, 6.00}

So far I have this:

#include <stdio.h>
#inlcude <stdlib.h>

#define MAXSIZE 100    

int main(int argc, char *argv[]) {
    int i = 0;
    int a, b;
    double c, d;
    int A[MAXSIZE], B[MAXSIZE];
    double C[MAXSIZE], D[MAXSIZE]

    while (scanf("%d %d %lf %lf", &a, &b, &c, &d) == 4) {

        A[i] = a;
        B[i] = b;
        C[i] = c;
        D[i] = d;
    }
    return 0;
}

My issue is how to do I store my columns of data in each array with the correct index? I also have been using input file redirection:

program.exe < txtfile.txt

This is because I want to be able to read any sort of text file with columns of data like the one above.

Bounty information, since it didn't look nice when i posted it:

Okay so I want to be able to see if the first column and second column have recurring digits at the same time. For example, in the first column, there are recurring '03' going down, and in the second column, there are recurring '01' going down. Both happen at the same stage, like this:

    03 01
    03 01
    03 01

I want to be able to recongize that and if that is true, I want to be able to sum the doubles on the fifth column(far right). I want it to look like this:

    01 01 5.00 1.50 7.50
    02 01 4.00 3.00 12.00
    02 02 3.00 4.00 12.00
    03 01 4.50 3.00  ---
    03 01 7.50 2.50  ---
    03 01 6.00 0.50 35.25 
    04 01 2.00 3.00 6.00 
    04 02 2.00 3.00 6.00
    05 01 1.50 3.00 4.50
    07 01 5.00 1.00 5.00
    09 01 1.50 6.00 9.00

other wise, I want the program to continue searching for the first/second column occurrence. A bit of extra background info, The first column is a room type, the second column is a room instance, and the fifth column is the total area of those rooms. This is why I want to sum the areas on the far right, because the room types are the same as the instances.


回答1:


Not sure if I understood your question correctly but here's an idea:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100    

int main(int argc, char *argv[]) {
int i = 0;
int a, b;
double c, d;
int A[MAXSIZE], B[MAXSIZE];
double C[MAXSIZE], D[MAXSIZE];
int previousA=-1, previousB=-1;
double tempsum=0.0;

while (scanf("%d %d %lf %lf", &a, &b, &c, &d) == 4) {

    A[i] = a;
    B[i] = b;
    C[i] = c;
    D[i] = d;
    if (previousA==A[i] && previousB==B[i]) { //to check for recurrent values
        tempsum+=(C[i]*D[i]);
    }
    else {
        //do whatever you want with the last stored tempsum value, which is the result of the multiplication of the C and D elements needed
        tempsum=(C[i]*D[i]); //then tempsum is reset to the current multiplication
    }
    i++;
}
return 0;

}




回答2:


#include <stdio.h>
#inlcude <stdlib.h>

#define MAXSIZE 100    

int main(int argc, char *argv[]) {
    int i = 0;
    int a, b;
    double c, d;
    int A[MAXSIZE], B[MAXSIZE];
    double C[MAXSIZE], D[MAXSIZE]

    while (scanf("%d %d %lf %lf", &a, &b, &c, &d) == 4) {

        A[i] = a;
        B[i] = b;
        C[i] = c;
        D[i] = d;
        i++; // your saviour  
    }
    return 0;
}



回答3:


the following code:

cleanly compiles
does not leave trash in unused entries in arrays
eliminates unneeded variables
checks to assure that arrays are not overflowed
removes ~1/2 the statements in the code as they are not needed
corrects the spelling of the word `include`

and now the code:

#include <stdio.h>
#include <stdlib.h> // size_t

#define MAXSIZE (100)

int main( void )
{
    int    A[MAXSIZE] = {0};
    int    B[MAXSIZE] = {0};
    double C[MAXSIZE] = {0.0};
    double D[MAXSIZE] = {0.0};

    for ( size_t i=0;
          i< MAXSIZE && (scanf("%d %d %lf %lf", 
                               &A[i], &B[i], &C[i], &D[i]) == 4);
          i++);

    return 0;
}



回答4:


Modifying the code from already approved answer to fit the requirement of the bounty -

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100    

int main(int argc, char *argv[]) {
    int i = 0;
    int a, b;
    double c, d, e;
    int A[MAXSIZE], B[MAXSIZE];
    double C[MAXSIZE], D[MAXSIZE], E[MAXSIZE];

    while (scanf("%d %d %lf %lf %lf", &a, &b, &c, &d, &e) == 5) {

        A[i] = a;
        B[i] = b;
        C[i] = c;
        D[i] = d;
        if (i > 0 && A[i] == A[i-1] && B[i] == B[i-1])
        {
          E[i] = E[i-1] + e;
          E[i-1] = -1;
        }
        else
          E[i] = e;
        i++;  
    }
    for (int j = 0; j < i; j++)
    {
      printf("%d %d %.2lf %.2lf %.2lf\n", A[j], B[j], C[j], D[j], E[j]);
    }
    return 0;
}

For the given input it will print -

1 1 5.00 1.50 7.50
2 1 4.00 3.00 12.00
2 2 3.00 4.00 12.00
3 1 4.50 3.00 -1.00
3 1 7.50 2.50 -1.00
3 1 6.00 0.50 35.25
4 1 2.00 3.00 6.00
4 2 2.00 3.00 6.00
5 1 1.50 3.00 4.50
7 1 5.00 1.00 5.00
9 1 1.50 6.00 9.00


来源:https://stackoverflow.com/questions/36673337/reading-text-file-and-storing-columns-in-an-array

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!