#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *fname ="E:\\00-C++\\VC2010\\PROJEKTE\\testfile.txt";
const int first_min =3;
const int first_max =12;
int first_number =0;
const long second_min =100;
const long second_max =1000000;
const int max_linelength =100;
char line[max_linelength+5];
int lineno =0;
long number[first_max+5];
int ixnumber =0;
void funcPrintRuler()
{
printf("\n");
printf("\n.........1.........2.........3.........4.........5.........6.........7.........8.........9");
printf("\n123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
}
int funcOnlyDigitsOrSpaceAllowed(int lineno,char *line)
{
int kzdigit =0;
int pos =0;
char *p =line;
while (NULL!=*p)
{
pos++;
if (isdigit(*p)) {kzdigit=1;p++;continue;}
if (' '==*p) {p++;continue; }
funcPrintRuler();
printf("\n%s",line);
printf("\n%d.line: Only digits or space allowed. pos=%d",lineno,pos);
printf("\n");
return 0;
}
if (0==kzdigit)
{
funcPrintRuler();
printf("\n%s",line);
printf("\n%d.line: digits are missing",lineno);
printf("\n");
return 0;
}
return 1;
}
void funcGetNumbers(int lineno,char *line)
{
char *p =line;
ixnumber =0;
while (NULL!=*p )
{
if (ixnumber>=first_max) return ;
if (' '==*p) {p++; continue;}
number[ixnumber]=atol(p);
while( NULL!=*p && isdigit(*p)) {p++; continue;}
ixnumber++;
p++;
}
}
int funcCheckLine1(int lineno,char *line)
{
funcGetNumbers(lineno,line);
if (1!=ixnumber )
{
printf("\n%d.line=%s<",lineno,line);
printf("\nonly one number allowed");
return 0;
};
if ( number[0]<first_min || number[0]>first_max )
{
printf("\n%d.line=%s<",lineno,line);
printf("\n%d.line contains number=%d, but must be >=%d and <=%d",lineno,number[0],first_min,first_max);
return 0;
}
return 1;
}
int funcCheckLine2(int lineno,char *line)
{
int i;
funcGetNumbers(lineno,line);
if (ixnumber!=first_number )
{
printf("\n%d.line=%s<",lineno,line);
printf("\nnumber count=%d, but must be %d",ixnumber, first_number);
return 0;
};
for(i=0; i<ixnumber;i++)
{
if (number[i]<second_min || number[i]>second_max )
{
printf("\n%d.line=%s<",lineno,line);
printf("\nnumber %d=%d, but must be >=%d and <=%d",i+1,number[i],second_min,second_max);
return 0;
}
}
return 1;
}
int main(int argc, char *argv[])
{
int i;
FILE *fp;
int lg=0;
printf("START");
fp = fopen (fname, "r");
if (fp == NULL) { printf ("Cannot open: \n%s",fname); goto w_err;}
while (NULL != fgets(line, max_linelength, fp))
{
lineno++;
lg=strlen(line);
line[lg-1]='\0';
switch( lineno )
{
case 1:
if ( !funcOnlyDigitsOrSpaceAllowed(lineno,line) ) goto w_err;
if ( !funcCheckLine1(lineno,line) ) goto w_err;
first_number=number[0];
break;
case 2:
if ( !funcOnlyDigitsOrSpaceAllowed(lineno,line) ) goto w_err;
if ( !funcCheckLine2(lineno,line) ) goto w_err;
break;
default:
printf("\n%d.line=%s<",lineno,line);
}
}
fclose (fp);
w_ok:
printf("\n\nFile Content:");
printf("\nline 1 read %d=number count for line 2",first_number);
for (i=0; i<ixnumber; i++)
{
printf("\nline 2 read %d.number=%ld",i+1,number[i]);
}
printf("\nprogram OK");
getc(stdin);
exit(EXIT_SUCCESS);
w_err:
printf("\nprogram error");
getc(stdin);
exit(EXIT_FAILURE);
}