Если все, с чем у вас проблемы - это пустые строки, используйте strcmp("\n", buffer) == 0
.
Регулярное выражение, которое вы разместили, не будет работать очень хорошо, потому что C переведет символ '\n'
в "%*[^\n]"
в буквальный перевод строки. Чтобы она работала лучше, вам нужно пересечь косую черту: "%*[^
\
\n]"
.
Однако, похоже, проблема также в чтении, я рекомендую вам использовать для этого лучшую функцию.
Ранее я использовал следующий код для чтения последовательных строк произвольного размера из файла.
Пара замечаний:
- Возвращенный буфер должен быть
free()
d после того, как с ним покончено
- Код тратит пару байтов на каждую итерацию, но это не очень заметно, если
BUFFER_SIZE
не очень мало по сравнению с длиной строк.
Код, однако, гарантирует, что одна полная строка будет прочитана из FILE *
и будет заканчиваться на '\ n'.
/*
* Initial size of the read buffer
*/
#define DEFAULT_BUFFER 1024
/*
* Standard boolean type definition
*/
typedef enum{ false = 0, true = 1 }bool;
/*
* Flags errors in pointer returning functions
*/
bool has_err = false;
/*
* Reads the next line of text from file and returns it.
* The line must be free()d afterwards.
*
* This function will segfault on binary data.
*/
char *readLine(FILE *file){
char *buffer = NULL;
char *tmp_buf = NULL;
bool line_read = false;
int iteration = 0;
int offset = 0;
if(file == NULL){
fprintf(stderr, "readLine: NULL file pointer passed!\n");
has_err = true;
return NULL;
}
while(!line_read){
if((tmp_buf = malloc(DEFAULT_BUFFER)) == NULL){
fprintf(stderr, "readLine: Unable to allocate temporary buffer!\n");
if(buffer != NULL)
free(buffer);
has_err = true;
return NULL;
}
if(fgets(tmp_buf, DEFAULT_BUFFER, file) == NULL){
free(tmp_buf);
break;
}
if(tmp_buf[strlen(tmp_buf) - 1] == '\n') /* we have an end of line */
line_read = true;
offset = DEFAULT_BUFFER * (iteration + 1);
if((buffer = realloc(buffer, offset)) == NULL){
fprintf(stderr, "readLine: Unable to reallocate buffer!\n");
free(tmp_buf);
has_err = true;
return NULL;
}
offset = DEFAULT_BUFFER * iteration - iteration;
if(memcpy(buffer + offset, tmp_buf, DEFAULT_BUFFER) == NULL){
fprintf(stderr, "readLine: Cannot copy to buffer\n");
free(tmp_buf);
if(buffer != NULL)
free(buffer);
has_err = true;
return NULL;
}
free(tmp_buf);
iteration++;
}
return buffer;
}