Open the file but do not save the args
-
#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: 0Sorry for the bad english!
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 ofint 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 parameterchar *arg[]
andchar **arg
are equivalent. You also have a type issues withop
. It's declared asint *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 tocalloc()
, consider what might happen if you decide you want to changeop
from anint
to along
, and what might happen if you forget that you need change the call to calloc() too. -
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
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
-
The three
if()
conditions in yourfor()
loop are always looking atop[ct]
rather thanop[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
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=]|
-
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 ofint 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 parameterchar *arg[]
andchar **arg
are equivalent. You also have a type issues withop
. It's declared asint *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 tocalloc()
, consider what might happen if you decide you want to changeop
from anint
to along
, and what might happen if you forget that you need change the call to calloc() too. -
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=]|
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
-
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
-
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
0I'm really thankful! :D
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
-
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--'
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?
-
#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: 0Sorry for the bad english!
-
The program is working fine now, just needed to close the file and open again to read the data. Ty for the help everyone!
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