Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Open the file but do not save the args

Open the file but do not save the args

Scheduled Pinned Locked Moved C / C++ / MFC
helpquestionperformance
13 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H honor3us

    #include #include #include int main(int *op[]) {
    char n;
    int total;
    int ct = 0, oper1 = 0, oper2 = 0, oper3 = 0, i = 0;
    FILE *arq1;

    arq1 = fopen("Maq1.log", "r"); //open file
    while (!feof(arq1)) {
    n = fgetc(arq1);
    if (n == "\n") { //count lines
    ct++;
    }
    }
    op = (int*) calloc(ct, sizeof(int)); //alloc memory
    if(op==0) {
    printf("Não houve memoria alocada!\n");
    return 0;
    }
    for(i=0;!feof(arq1);i++) {
    fscanf(",,,%d,", &op[ct]); //I think this is the error
    }
    for(i=0;i<=ct;i++) { //do the count
    if(op[ct] == 1){
    oper1++;
    }
    if(op[ct] == 2){
    oper2++;
    }
    if(op[ct] == 3){
    oper3++;
    }
    }
    total = oper1 + oper2 + oper3;
    printf("Operacao 1: %d \n Operacao 2: %d \n Operacao 3: %d \n Total: %d \n", oper1, oper2, oper3, total); //and print!
    fclose(arq1);
    return 0;
    }

    Can you guys help me on this Code? I have no idea of what is happening, but when I run the code he prints

    Operacao 1: 0
    Operacao 2: 0
    Operacao 3: 0
    Total: 0

    Sorry for the bad english!

    K Offline
    K Offline
    k5054
    wrote on last edited by
    #4

    This has nothing to do with the solution to your problem, as DavidCrow has already given you a clue. I'm just wondering if your compiler isn't giving you any warnings about your definition of main(). int main(int *op[]) definitely isn't one of the normal ways to define main() Normally it would be one of

    int main()
    int main(void)
    int main(int argc, char *argv[])
    int main(int argc, char **argv)

    On some systems you might also be able to use int main(int argc, char *arg[], char *envp[]) Note that as a function parameter char *arg[] and char **arg are equivalent. You also have a type issues with op. It's declared as int *op[], which is an array of pointer to int, but you are using it as a pointer to int. What you probably want to do is:

    int main(void)
    {
    ...
    int \*op;
    op = (int\*)calloc(ct, sizeof *op);
    ...
    }

    If you're wondering why I used sizeof *op as the second argument to calloc(), consider what might happen if you decide you want to change op from an int to a long, and what might happen if you forget that you need change the call to calloc() too.

    H 1 Reply Last reply
    0
    • J jeron1

      Have you tried stepping through the code using a debugger?

      "the debugger doesn't tell me anything because this code compiles just fine" - random QA comment "Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst "I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle

      H Offline
      H Offline
      honor3us
      wrote on last edited by
      #5

      gcc -c "trabalho.c" -o "trabalho.o"
      trabalho.c: In function ‘main’:
      trabalho.c:22:11: warning: comparison between pointer and integer
      if (n == "\n") { //count lines
      ^
      trabalho.c:35:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘int’ [-Wformat=]
      fscanf(arq1, ",,,%d,", op[ct]); //I think this is the error
      ^
      g++ -o "trabalho.o"
      Process terminated with status 0 (0 minute(s), 0 second(s))
      0 error(s), 2 warning(s) (0 minute(s), 0 second(s))

      Checking for existence: /home//
      Executing: xterm -T 'dest" (in origem)
      Process terminated with status 0 (0 minute(s), 2 second(s))

      When I compile the .c archive, appears just those 2 warnings

      1 Reply Last reply
      0
      • D David Crow

        The three if() conditions in your for() loop are always looking at op[ct] rather than op[i]. I do not think that is your intent. ;) A date with the debugger, as jeron1 suggested, would have unveiled that.

        "One man's wage rise is another man's price increase." - Harold Wilson

        "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

        "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

        H Offline
        H Offline
        honor3us
        wrote on last edited by
        #6

        Thank you! I didn't see that error of logic... --' But still giving me the same answer :/ I think the error is when he count the lines on

        char n;
        while (!feof(arq1)) {
        n = fgetc(arq1);
        if (n == "\n") { //count lines
        ct++;
        }
        }

        warning: assignment makes pointer from integer without a cast and...

        for(i=0;!feof(arq1);i++) {
        fscanf(arq1, ",,,%d,", op[i]); //I think this is the error
        }

        format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘int’ [-Wformat=]|

        D 1 Reply Last reply
        0
        • K k5054

          This has nothing to do with the solution to your problem, as DavidCrow has already given you a clue. I'm just wondering if your compiler isn't giving you any warnings about your definition of main(). int main(int *op[]) definitely isn't one of the normal ways to define main() Normally it would be one of

          int main()
          int main(void)
          int main(int argc, char *argv[])
          int main(int argc, char **argv)

          On some systems you might also be able to use int main(int argc, char *arg[], char *envp[]) Note that as a function parameter char *arg[] and char **arg are equivalent. You also have a type issues with op. It's declared as int *op[], which is an array of pointer to int, but you are using it as a pointer to int. What you probably want to do is:

          int main(void)
          {
          ...
          int \*op;
          op = (int\*)calloc(ct, sizeof *op);
          ...
          }

          If you're wondering why I used sizeof *op as the second argument to calloc(), consider what might happen if you decide you want to change op from an int to a long, and what might happen if you forget that you need change the call to calloc() too.

          H Offline
          H Offline
          honor3us
          wrote on last edited by
          #7

          Thank you! You help me a lot! But the compiler still having problem to count lines and fscanf the data I need, I don't have a clue what is going on--'

          K 1 Reply Last reply
          0
          • H honor3us

            Thank you! I didn't see that error of logic... --' But still giving me the same answer :/ I think the error is when he count the lines on

            char n;
            while (!feof(arq1)) {
            n = fgetc(arq1);
            if (n == "\n") { //count lines
            ct++;
            }
            }

            warning: assignment makes pointer from integer without a cast and...

            for(i=0;!feof(arq1);i++) {
            fscanf(arq1, ",,,%d,", op[i]); //I think this is the error
            }

            format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘int’ [-Wformat=]|

            D Offline
            D Offline
            David Crow
            wrote on last edited by
            #8

            honor3us wrote:

            if (n == "\n") { //count lines

            Why are you not using:

            if (n == '\n')

            "One man's wage rise is another man's price increase." - Harold Wilson

            "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

            "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

            H 1 Reply Last reply
            0
            • D David Crow

              honor3us wrote:

              if (n == "\n") { //count lines

              Why are you not using:

              if (n == '\n')

              "One man's wage rise is another man's price increase." - Harold Wilson

              "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

              "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

              H Offline
              H Offline
              honor3us
              wrote on last edited by
              #9

              Another error, sorry :/ I changed to 'n' and &op[i] and all the warnings are gonne! :) The programs runs perfectly but all the values of vector op[] are == 0. ex:

              printf("%d\n%d", op[4], op[5]);

              The answer still

              0
              0

              I'm really thankful! :D

              D 1 Reply Last reply
              0
              • H honor3us

                Another error, sorry :/ I changed to 'n' and &op[i] and all the warnings are gonne! :) The programs runs perfectly but all the values of vector op[] are == 0. ex:

                printf("%d\n%d", op[4], op[5]);

                The answer still

                0
                0

                I'm really thankful! :D

                D Offline
                D Offline
                David Crow
                wrote on last edited by
                #10

                See here.

                "One man's wage rise is another man's price increase." - Harold Wilson

                "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                1 Reply Last reply
                0
                • H honor3us

                  Thank you! You help me a lot! But the compiler still having problem to count lines and fscanf the data I need, I don't have a clue what is going on--'

                  K Offline
                  K Offline
                  k5054
                  wrote on last edited by
                  #11

                  You might want to look at this section of the code ... there's definitely an issue here:

                  for( i=0; i<=ct; i++) { //do the count
                  if(op[ct] == 1){
                  oper1++;
                  }

                  Also, you are accessing past the end of the array *op[]* -- what should the end condition for the loop be?

                  1 Reply Last reply
                  0
                  • H honor3us

                    #include #include #include int main(int *op[]) {
                    char n;
                    int total;
                    int ct = 0, oper1 = 0, oper2 = 0, oper3 = 0, i = 0;
                    FILE *arq1;

                    arq1 = fopen("Maq1.log", "r"); //open file
                    while (!feof(arq1)) {
                    n = fgetc(arq1);
                    if (n == "\n") { //count lines
                    ct++;
                    }
                    }
                    op = (int*) calloc(ct, sizeof(int)); //alloc memory
                    if(op==0) {
                    printf("Não houve memoria alocada!\n");
                    return 0;
                    }
                    for(i=0;!feof(arq1);i++) {
                    fscanf(",,,%d,", &op[ct]); //I think this is the error
                    }
                    for(i=0;i<=ct;i++) { //do the count
                    if(op[ct] == 1){
                    oper1++;
                    }
                    if(op[ct] == 2){
                    oper2++;
                    }
                    if(op[ct] == 3){
                    oper3++;
                    }
                    }
                    total = oper1 + oper2 + oper3;
                    printf("Operacao 1: %d \n Operacao 2: %d \n Operacao 3: %d \n Total: %d \n", oper1, oper2, oper3, total); //and print!
                    fclose(arq1);
                    return 0;
                    }

                    Can you guys help me on this Code? I have no idea of what is happening, but when I run the code he prints

                    Operacao 1: 0
                    Operacao 2: 0
                    Operacao 3: 0
                    Total: 0

                    Sorry for the bad english!

                    H Offline
                    H Offline
                    honor3us
                    wrote on last edited by
                    #12

                    The program is working fine now, just needed to close the file and open again to read the data. Ty for the help everyone!

                    D 1 Reply Last reply
                    0
                    • H honor3us

                      The program is working fine now, just needed to close the file and open again to read the data. Ty for the help everyone!

                      D Offline
                      D Offline
                      David Crow
                      wrote on last edited by
                      #13

                      honor3us wrote:

                      ...just needed to close the file and open again...

                      Or call rewind().

                      "One man's wage rise is another man's price increase." - Harold Wilson

                      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                      "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups