954,499 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

need help in C

hi all.
i need help...
1.how do i copy a line in a text file into a struct.
2. the text file i have is this:

10 SasonSasoniBenSason 100 100
5 Pinokio 70 90
20 JohnRambo 50 87
3 Elvis 3 77
50 JamesBond 17 1
40 BillGates 91 8

i need to sort it(without using a sort function like buble sort)
how do i refer just to the number(10,5,20) so i can sort them.
i need to sort it into a new text file with out using a temp txt file.
pls help me.

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

first read the file line by line. copy the line content into a string. now use strtok () function to seperate the copied string contends.use atoi() function to tgake the numbers out.
For sorting you can use any logic. since you have only 3 numbers you can use comparision.

carobee
Posting Whiz in Training
209 posts since Dec 2007
Reputation Points: 10
Solved Threads: 12
 

can u pls write me the whole commands? cuz i dont have msdn installed... and we didnt learn how to do it yet.
and how do i sort the whole line? not just the numbers
thanks alot!

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

oh and another thing.
how do i refer to each line as a line? thats my main problem... thanks

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 
oh and another thing. how do i refer to each line as a line? thats my main problem... thanks


you can use fgets()

carobee
Posting Whiz in Training
209 posts since Dec 2007
Reputation Points: 10
Solved Threads: 12
 

thats what im doing... but it doesnt work...

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

>thats what im doing...
Actually, you aren't doing anything at all since you haven't posted any code.

>but it doesnt work...
I keep saying this, but it keeps falling on deaf ears. "It doesn't work" is utterly, completely, totally useless! Clearly it doesn't work, otherwise you wouldn't be asking for help. But "it doesn't work" is never going to get you clear and accurate help for your problems.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

thats the code i've written so far. now i need to sort it. thanks for your patience.

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

#define LEN 30
#define LENST 6

int j=0;
char *str[6];
typedef struct
{
	int id;		//מספר הזהות של הסטודנט
	char full_name[LEN];		//שם ושם משפחה
    	struct
	{
		unsigned sem_a;		//ממוצע הציונים בסמסטר ראשון
		unsigned sem_b;		//ממוצע הציונים בסמסטר שני
	}grades;					//משתנה של ציונים מטיפוס של מבנה
}Student;

Student A[]={
		{10,"   SasonSasoniBenSason   ",100,100},
		{5,"    Pinokio    ",70,90},
		{20,"       JohnRambo ",50,87},
		{3,"Elvis",3,77},
		{50," JamesBond", 17,1},
		{40,"BillGates",91,8}
	};

FILE *f;
FILE *to_f;

char first;
char second;
char c,t,g,s;
void write_2_file( char first) //writing the first file. after that im not allowed to touch A struct again.
{
	int a=1, i;
	f=fopen("one.txt", "w");
	if (f==NULL) exit(1);
	else 
	{
		printf("the file one has been opened \n\r");
		fflush(stdin);
		for(i=0;i<LENST;i++)
		{
			
				  fprintf(f, "%d %s %u %u\n\r", A[i].id, A[i].full_name, A[i].grades.sem_a, A[i].grades.sem_b);
				  
			   
			  
			
			 
		}
			  if (fclose(f)) exit(1);
			  else 
				  printf("\nthe file has been closed\n\r");
	} 

}

 void coping(char first, char second) // this function need to copy the first file to a second file sorted with no sort function. 
{

	f=fopen("one.txt", "r");
	to_f=fopen("two.txt", "w");
	if ((f== NULL) || (to_f==NULL)) exit(1);
	else
	{
	
		printf("the files have been opened\n\r");
		
		
		
		 //for (fscanf(f, "%c", &c); !feof(f); fscanf(f, "%c", &c))
		//{ 
			while (!(feof(f)))
			{
				fgets(str[j],30,f);
				//fputs(str,stdout);
			j++;
			}
			

			//fprintf(to_f, "%c", c);
			//fprintf(stdout, "%c",c);
			
		//} 
		if((fclose(to_f)) || (fclose(f))) exit(1);
		else
			printf("\n\rthe files had been closed\n\r");
	}
	
}


void main()
	{
		

		write_2_file(first);
		coping(first,second);
	}
severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

I notice you're not allowed to use a sort function. I'm guessing that rule is specifically for qsort, but what about a function you write yourself? I get the impression that you're trying to figure out how to sort the file as you write it, which is...difficult. You'd be better off storing the records in a dynamic collection, sorting the collection, then writing the collection to your output file. That's much easier.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

and how do i do that?
i cant create or use a temp file.

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

>i cant create or use a temp file.
You wouldn't want to unless there are so many records that you can't practically keep them all in memory. Here's a quick example using a less complicated record type. You can use it as a template:

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

int *load_file ( FILE *in, size_t *n )
{
  int *list = NULL;
  int value;

  while ( fscanf ( in, "%d", &value ) == 1 ) {
    int *save = realloc ( list, ( *n + 1 ) * sizeof *save );

    if ( save == NULL ) {
      free ( list );
      list = NULL;
      *n = 0;
      break;
    }

    list = save;
    list[*n] = value;
    ++(*n);
  }

  return list;
}

void sort_list ( int *list, size_t n )
{
  size_t i;
  size_t j;

  for ( i = 1; i < n; i++ ) {
    int save = list[i];

    for ( j = i; j >= 1 && list[j - 1] > save; j-- )
      list[j] = list[j - 1];

    list[j] = save;
  }
}

void write_file ( FILE *out, int *list, size_t n )
{
  while ( n-- > 0 )
    fprintf ( out, "%d\n", *list++ );
}

int main ( void )
{
  FILE *in = fopen ( "test.txt", "r" );
  int *list = NULL;
  size_t n = 0;

  if ( in == NULL ) {
    perror ( "Error opening file" );
    return EXIT_FAILURE;
  }

  list = load_file ( in, &n );
  sort_list ( list, n );
  write_file ( stdout, list, n );

  return EXIT_SUCCESS;
}
Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

ive tried and tried and still nothing.
i just dont get it.
how do i copy the line in my struct and copy it as a string...

severman
Junior Poster in Training
70 posts since Mar 2008
Reputation Points: 10
Solved Threads: 0
 

Sample code to help you

#include <stdio.h>

int main()
{
    FILE *read, *write;
    char Buffer[BUFSIZ];
    
    if( ( read = fopen("x.txt", "r") ) ==  NULL )
    {
        printf("Error: File cannot be opened\n");
        return 1;
    }
    
    if( ( write = fopen("Tempx.txt", "a") ) ==  NULL )
    {
        printf("Error: File cannot be opened\n");
        return 1;
    }    
    
    if( fgets( Buffer, BUFSIZ, read) != NULL )
        fprintf( write, "%s", Buffer );
    
    fprintf( write, "%s - %s\n", "Name", "Name2" );
    
    while( fgets( Buffer, BUFSIZ, read) != NULL )
           fprintf( write, "%s", Buffer );
    
    fclose(read);
    fclose(write);
    


    return 0;
}
carobee
Posting Whiz in Training
209 posts since Dec 2007
Reputation Points: 10
Solved Threads: 12
 
ive tried and tried and still nothing. i just dont get it. how do i copy the line in my struct and copy it as a string...

okay, here's your structure

#
typedef struct {
    int id; 
    char full_name[LEN]; 
    struct {
        unsigned sem_a; 
        unsigned sem_b;
    }grades; 
}Student;


so you need to declare a variable of type student, then fill each of its elements. here's a very basic way that will suffice for illustration:

// declares an array of 10 students
Student myStudents[10];

// make a temp buffer long enough to read each line
char buffer[64];

// declare some temp vars to store data 
// not neccessary, but good for illustration here.
int num, first, second;
char name[32];

//  normally "buffer" would have the string read 
//  into it by fgets() ... for this example I'm just
//  using a simple strcpy( ) to illustrate
strcpy(buffer,"15 JoeSchmoe 95 87");  

// scanf expects data fields to be formatted precisely.
// format variations will cause unexpected results.
// copy the fields into temp variables
scanf(buffer,"%d %s %d %d", &num, name, &first, &second);

// write the fields into the first index of your student array structure
myStudent[0].id = num;
strcpy(myStudent[0].full_name, name);
myStudent[0].grades.sem_a = first;
myStudent[0].grades.sem_b = second;


now your "myStudent" array has its first element filled

you would of course want to use a while loop in which you would repeatedly do an fgets( ) to read the lines, along with an incremental counter to move through each index of the "myStudent" array


.

jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

now if you want to access any element for inspection, just call it like so:

int lowestIdNum = 99;
int lowestStudentIndex= -1;

for (a = 0; a < totalNumOfStudents; a++) 
{
    if (Student[a].id <lowestIdNum )
    {
        lowestIdNum = Student[a].id;
        lowestStudentIndex= a;
    }
}

printf("Student: %s has the lowest ID number (%d)\n",
            Student[lowestStudentIndex].full_name,
            lowestIdNum );
jephthah
Posting Maven
2,587 posts since Feb 2008
Reputation Points: 2,143
Solved Threads: 179
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You