i thought fgets would make my program faster than if i used fgetc but because of my poor understanding on how fgets actually work my final code has alot of issues like leaving empty lines at the bottom of the file, if anyone can figure out how to fix this I’m thankful
<code>#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
int main() {
FILE *file, *f;
char line[100], l[100]; // buffers to move and copy lines in the file
int count = 1, // this counts the line we're in right now
StartDelete = 6, //here the first line of the sequence that we're gonna delete
EndDelete = 10, // the line where deleting end
size = 10; // how many lines in the file
file = fopen("data.txt", "w+"); // Open the file in read-write mode
f = fopen("data.txt", "r+"); // open another handle for the file to skip the lines we wanna delete
if (file == NULL || f == NULL) {
printf("Error opening file.n");
return 1;
}
//take user's input
for ( int i = 0; i < size; ++i ) {
printf("name %d: ", i+1);
assert( fgets( line, sizeof(line), stdin ) );
fprintf( file, "%s%s", "name: ", line );
}
rewind(file); // going back to the start of the file
//
while( count <= EndDelete ) {
count++;
fgets(l, sizeof(l), f);
}
count = 0;// reset the lines counter to zero this time because of the way fgets work
// Read each line and overwrite the file with lines that are not marked for deletion
while (fgets(line, sizeof(line), file)) { //moving to the lines in the file
count++;//the line conter grows as we move forward in lines
if (count > StartDelete) {
fseek(file, -strlen(line), SEEK_CUR);//going back to the beginning of the line again because of the mechanism of fgets
fwrite(l, sizeof(char), strlen(l), file);//overwriting
if(fgets(l, sizeof(l), f));//moving to the next line we wanna overwrite with
else break;
}
}
// Truncate the file to remove any remaining content beyond the new end of file
fseek(file, ftell(file), SEEK_SET);
ftruncate(fileno(file), ftell(file));
fclose(file);
return 0;
}
</code>
<code>#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
int main() {
FILE *file, *f;
char line[100], l[100]; // buffers to move and copy lines in the file
int count = 1, // this counts the line we're in right now
StartDelete = 6, //here the first line of the sequence that we're gonna delete
EndDelete = 10, // the line where deleting end
size = 10; // how many lines in the file
file = fopen("data.txt", "w+"); // Open the file in read-write mode
f = fopen("data.txt", "r+"); // open another handle for the file to skip the lines we wanna delete
if (file == NULL || f == NULL) {
printf("Error opening file.n");
return 1;
}
//take user's input
for ( int i = 0; i < size; ++i ) {
printf("name %d: ", i+1);
assert( fgets( line, sizeof(line), stdin ) );
fprintf( file, "%s%s", "name: ", line );
}
rewind(file); // going back to the start of the file
//
while( count <= EndDelete ) {
count++;
fgets(l, sizeof(l), f);
}
count = 0;// reset the lines counter to zero this time because of the way fgets work
// Read each line and overwrite the file with lines that are not marked for deletion
while (fgets(line, sizeof(line), file)) { //moving to the lines in the file
count++;//the line conter grows as we move forward in lines
if (count > StartDelete) {
fseek(file, -strlen(line), SEEK_CUR);//going back to the beginning of the line again because of the mechanism of fgets
fwrite(l, sizeof(char), strlen(l), file);//overwriting
if(fgets(l, sizeof(l), f));//moving to the next line we wanna overwrite with
else break;
}
}
// Truncate the file to remove any remaining content beyond the new end of file
fseek(file, ftell(file), SEEK_SET);
ftruncate(fileno(file), ftell(file));
fclose(file);
return 0;
}
</code>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
int main() {
FILE *file, *f;
char line[100], l[100]; // buffers to move and copy lines in the file
int count = 1, // this counts the line we're in right now
StartDelete = 6, //here the first line of the sequence that we're gonna delete
EndDelete = 10, // the line where deleting end
size = 10; // how many lines in the file
file = fopen("data.txt", "w+"); // Open the file in read-write mode
f = fopen("data.txt", "r+"); // open another handle for the file to skip the lines we wanna delete
if (file == NULL || f == NULL) {
printf("Error opening file.n");
return 1;
}
//take user's input
for ( int i = 0; i < size; ++i ) {
printf("name %d: ", i+1);
assert( fgets( line, sizeof(line), stdin ) );
fprintf( file, "%s%s", "name: ", line );
}
rewind(file); // going back to the start of the file
//
while( count <= EndDelete ) {
count++;
fgets(l, sizeof(l), f);
}
count = 0;// reset the lines counter to zero this time because of the way fgets work
// Read each line and overwrite the file with lines that are not marked for deletion
while (fgets(line, sizeof(line), file)) { //moving to the lines in the file
count++;//the line conter grows as we move forward in lines
if (count > StartDelete) {
fseek(file, -strlen(line), SEEK_CUR);//going back to the beginning of the line again because of the mechanism of fgets
fwrite(l, sizeof(char), strlen(l), file);//overwriting
if(fgets(l, sizeof(l), f));//moving to the next line we wanna overwrite with
else break;
}
}
// Truncate the file to remove any remaining content beyond the new end of file
fseek(file, ftell(file), SEEK_SET);
ftruncate(fileno(file), ftell(file));
fclose(file);
return 0;
}
i tried deleting two and three from
<code>one
two
three
four
</code>
<code>one
two
three
four
</code>
one
two
three
four
and i get eventually
<code>one
four
</code>
<code>one
four
</code>
one
four
but with extra empty line at the end
New contributor
Taha is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.