My C mess... But seriously could use some help please.

Started by
3 comments, last by rip-off 10 years, 11 months ago

Hey guys I'm new to the C language and have only been studying it for about 14 weeks now and with my assignment I have hit a major brick in the road.


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include"structHeader.h"


void main()
{
FILE *inFile;
FILE *outFile;




if((inFile=fopen("Modules.txt","r"))==NULL)
{
printf("File Not Open");
exit(1);
}
if((outFile=fopen("Report.txt","w"))==NULL)
{
printf("File Not Open");
exit(1);
}


fprintf(outFile,"Students Marks Listed by Module\n\n");
printf("Students Marks Listed by Module\n\n");
finaltotals.marks=0;
while(!feof(inFile))
{
fscanf(inFile,"%[^,],%d%*c", course.modName, &course.studentRecords);
fprintf(outFile,"%s\n\n", course.modName);
printf("%s\n\n", course.modName);


fscanf(inFile,"%[^,],%d,%d%*c",records.studentName, &records.firstMark, &records.secondMark);
loops.lengthstring=strlen(records.studentName);
for (loops.forloop=0;loops.forloop<course.studentRecords;loops.forloop++)
{
finaltotals.marks+=records.firstMark+records.secondMark;


for(loops.characterLoop=0;loops.characterLoop<loops.lengthstring;loops.characterLoop++)
{
if(loops.characterLoop==0)
{
records.studentName[loops.characterLoop]=toupper(records.studentName[loops.characterLoop]);
fprintf(outFile,"%c", records.studentName);
printf("%c", records.studentName);
}
//it skips the next if statement all together... It should test the statement and when it is true it should enter... but it doesn't.
if(records.studentName[loops.characterLoop]==' ')
{
loops.characterLoop++;
records.studentName[loops.characterLoop]=toupper(records.studentName[loops.characterLoop]);
fprintf(outFile,"%-5s", records.studentName);
printf("%-19s", records.studentName);
}
fprintf(outFile,"%-19d %-19d\n", records.firstMark, records.secondMark);
printf("%-19d %-19d\n", records.firstMark, records. secondMark);
fscanf(inFile,"%[^,],%d,%d%*c",records.studentName, &records.firstMark, &records.secondMark);
}


fscanf(inFile,"%[^,],%d%*c", course.modName, &course.studentRecords);
fprintf(outFile,"%s\n\n", course.modName);
printf("%s\n\n", course.modName);
finaltotals.studentNum=0;
finaltotals.studentNum+=course.studentRecords;
}


}




system("pause");
}
 

Here is my structHeader.h


struct Module
{
int studentRecords;


char modName[50];
}course;
struct Enrolment
{
int firstMark,
secondMark;


char studentName[30];
}records;
struct Looping
{
int forloop,
lengthstring,
characterLoop;
}loops;
struct Totals
{
int marks,
studentNum;
}finaltotals;

 

Any feedback is much obliged.

'...when you have eliminated all which is impossible,

then whatever remains, however improbable, must be the truth.'

Sherlock Holmes.

Advertisement

And this major brick in the road is... what?

And this is a coding horror because... why?

Also, try editing your post to fix the indentation (you may have to do a search and replace in the code to convert tabs to sets of 4 spaces).

Edit: If you're talking about the problem mentioned in that one comment, have you stepped through your code with a debugger?

[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

Sorry should of been more specific. It was about 3am and I was very tired... anyways I am reading from my inFile and writing to my outFile. Now the code works in the manner of reading the file and writing it to the outfile, need to format the print though, but the toupper loop isn't working... it won't jump into the second loop once the for loop has reached the ' ' (char space) and then jump into the 'if' statement.

Now I ran a smaller version of the code I want to work and it works great but in the build I have above doesn't. Even though I have copied it from one that does.

'...when you have eliminated all which is impossible,

then whatever remains, however improbable, must be the truth.'

Sherlock Holmes.

Your code is very confusing because you have placed the loop counters in a global structure. This is not idiomatic. Generally one creates a local variable to handle loop counters.

When I compile your code:

 
user@host:~$ gcc main.c -Wall
main.c:9:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
main.c: In function ‘main’:
main.c:46:21: warning: format ‘%c’ expects argument of type ‘int’, but argument 3 has type ‘char *’ [-Wformat]
main.c:47:21: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat]

Executing code that contains such errors is prone to "undefined behaviour", which can result in surprising things happening. There are some other places where you are doing things wrong too, that the compiler cannot help you with.

Sorry should of been more specific. It was about 3am and I was very tired... anyways I am reading from my inFile and writing to my outFile. Now the code works in the manner of reading the file and writing it to the outfile, need to format the print though, but the toupper loop isn't working... it won't jump into the second loop once the for loop has reached the ' ' (char space) and then jump into the 'if' statement.

Have you run your code in a debugger?

Now I ran a smaller version of the code I want to work and it works great but in the build I have above doesn't. Even though I have copied it from one that does.

This is another excellent way of diagnosing such errors. Try again, but copy a little more of the program each time, until it starts misbehaving.

Another idea is to use a very simple input file, consisting of a single course with a single student record, when debugging your program.

I've moved this to "For Beginners", "Coding Horrors" is a forum for humourous snippets, usually encountered by experienced programmers reading their own or their colleague's code.

This topic is closed to new replies.

Advertisement