# A little problem with filing in C

## Main Question or Discussion Point

I'm writing an SJF scheduling algo and I'm having a little problem with filing. I'm to read data from a file. I've read the entire data in a single array/pointer but now I want to read every line in a separate array/pointer/string. I'm not able to do so. Ay help would be highly appreciated.

Here's the code so far:

Code:
int main ()
{
FILE *fptr;
int i;
printf ("Output from the file");
char s[500];
int count = 0;
fptr = fopen ("file.txt","r");
if (!f)
{
return 1;
}
while (fgets(s,1000,fptr) != NULL)
printf ("%s",s);
fclose(fptr);
return 0;
}
How can I read each line in a separate array/string/pointer?

Thanks.

Related Programming and Computer Science News on Phys.org
Borek
Mentor
Many ways to skin that cat.

Are all lines of the same length? Or different?

You can declare array of char pointers, read each line separately to a buffer, duplicate it and put the pointer to duplicate in the array.

Or you can declare two dimensional array (char[][]) large enough to accomodate all lines - that requires you to know maximum length before starting to work and can be very inefficient in tems of memory used.

Edit: have you tried to compile your program? Doesn't look like something correct.

yeah I've compiled it. I'm running it on Linux terminal and it's running fine. Thanks for the suggestion.

I've tried using char arrays for each lines and seems like it's working.

Borek
Mentor
Code:
if (!f)
{
return 1;
}
What is f?

oh. It was fptr actually. typo error.

Alright. I'm still having a few problems. I tried to get each line in a separate pointer but it's getting crazy. Here's the code:

Code:
int main ()
{
FILE *fptr;
int i;
printf ("Output from the file");
char s[500];
int count = 0;
fptr = fopen ("file.txt","r");
if (!fptr)
{
return 1;
}
while (fgets(s,1000,fptr) != NULL)
{
if (s[i] == 'P' && s[i+1] == '1')
{
while (s[i] != '\n')
{
count++;
i++;
}
}
for (for i=0; i<count; i++)
{
p1= malloc (sizeof (char)*count);
//printf ("%d", count);
p[i] = s[i];
}
printf ("%s",s);
}
for (i=0 i<count; i++)
{
printf ("%c", p1[i]);
}
fclose(fptr);
return 0;
}
PROBLEM:

The value of the counter in the loop is 4 (4 elements in the first row), and it indeed gies the value of the counter 4 when I printf the counter. But in the following loop:

Code:
for (for i=0; i<count; i++)
{
p1= malloc (sizeof (char)*count);
//printf ("%d", count);
p[i] = s[i];
}
It outputs the counter 40 times. What's going on?

Borek
Mentor
Use debugger and trace how values of the variables change during execution.

Code you show here is full of errors. Are you retyping it? Can't you copy and paste?

Yeah, retyping. I'm compiling it on another PC and internet is having problems there, so I'm using net on another PC.

Ok, I'll try to debug and see.

Here's a bit modification:

Code:
while (fgets(s,1000,fptr) != NULL)
{
if (s[i] == 'P' && s[i+1] == '1')
{
while (s[i] != '\n')
{
count++;
p1=malloc (sizeof(char)*count);
p1[count-1]=s[i];
//printf ("%c", p1[i]);
i++;
}
}
for (i=0 i<count; i++)
{
printf ("%c", p1[i]);
}
fclose(fptr);
return 0;
}
Now the counter is running fine and it's putting values in p1, but problem is in the last loop all p1 outputs in 0 four times.

Okay. I think using pointers would be a bad idea. Here the new code using only arrays:

Code:
int main ()
{
FILE *fptr;
arr[20];
int i;
printf ("Output from the file");
char s[500];
int count = 0;
fptr = fopen ("file.txt","r");
if (!fptr)
{
return 1;
}
while (fgets(s,1000,fptr) != NULL)
{
if (s[i] == 'P' && s[i+1] == '1')
{
while (s[i] != '\n')
{
count++;
arr[count]=s[i];
i++;
}
}
}
for (i=0 i<count; i++)
{
printf ("%c", arr[i]);
}
fclose(fptr);
return 0;
}
PROBLEM:

Only question: Why is the counter only 4 in the following loop?

Code:
 while (s[i] != '\n')
{
count++;
arr[count]=s[i];
i++;
}
File format is:

P1 0 (this is the first line. As the counter increments to only first, the array outputs in the final loop only P1 and not 0)

Borek
Mentor
Your code doesn't make sense - it contains errors, so it is impossible to analyse. i is used before being initialized, there is no such thing as arr[20] as it doesn't follow array declaration syntax and so on. Posting again and again and repeating the same invalid code you are only wasting time and it will get you nothing. I told you - trace all variables and see if they change as you think they do.