there is very long "dict.txt" file. the size of this file is about 2400273(calculated by fseek, SEEK_END) this file has lots of char like this 'apple = 사과'(simillar to dictionary)
Main problem is that reading file takes very long time
I couldn't find any solution to solve this problem in GOOGLE
The reason i guessed is associated with using fgets() but i don't know exactly.
please help me
here is my code written by C
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int line = 0;
char txt_str[50];
FILE* pFile;
pFile = fopen("dict_test.txt", "r");
if (pFile == NULL) {
printf("file doesn't exist or there is problem to open your file\n");
}
else {
do{
fgets(txt_str, 50, pFile);;
line ;
} while (txt_str != EOF);
}
printf("%d", line);
}
Output
couldn't see result because program was continuosly running
Expected
the number of lines of this txt file
CodePudding user response:
Major
- OP's code fail to test the return value of
fgets(). Code needs to check the return value offgets()to know when to stop. @A4L
do{
fgets(txt_str, 50, pFile);; // fgets() return value not used.
Other
Line count should not get incremented when
fgets()returnsNULL.Line count should not get incremented when
fgets()read a partial line. (I. e.) the line was 50 or longer. Reasonable to use a wider than 50 buffer.Line count may exceed
INT_MAX. There is always some upper bound, yet trivial to use a wider type.Good practice to close the stream.
Another approach to count lines would use
fread()to read chunks of memory and then look for start of lines. (Not shown)Recommend to print a
'\n'after the line count.
int main(void) {
FILE* pFile = fopen("dict_test.txt", "r");
if (pFile == NULL) {
printf("File doesn't exist or there is problem to open your file.\n");
return EXIT_FAILURE;
}
unsigned long long line = 0;
char txt_str[4096];
while (fgets(txt_str, sizeof txt_str, pFile)) {
if (strlen(txt_str) == sizeof txt_str - 1) { // Buffer full?
if (txt_str[sizeof txt_str - 1] != '\n') { // Last not \n?
continue;
}
}
line ;
}
fclose(pFile);
printf("%llu\n", line);
}
CodePudding user response:
fgets returns NULL on EOF.
You are never assigning the result of
fgets(txt_str, 50, pFile);
to txt_str, your program never sees the end of the file and thus enters an endless loop.
try something like this:
char* p_str;
do{
p_str = fgets(txt_str, 50, pFile);
line ;
} while (p_str != NULL);
