2013-06-10 2 views
2

Я просто хочу прочитать 10 строк из файла, затем отсортировать их и распечатать. Но что-то случилось с моим кодом, потому что, когда у меня есть такой файл:Сортировка строк из файла C

a 
d 
b 

c 

s 

(замечает перевод строки после «с») файл ее разновидность, но печатает «s» дважды:

a 

b 

c 

d 

s 

s 

, когда я удалите новую строку, все это хорошо. Где же тогда проблема? Наиболее важные части моего кода:

void sort(char **array, int filelinecount) 
{ 
    int i, j; 
    char t[LINE_MAX_SIZE]; 

    for(i=1;i<filelinecount;i++) 
    { 
     for(j=1;j<filelinecount;j++) 
     { 
      if(strcmp(array[j-1], array[j]) > 0) 
      { 
       strcpy(t, array[j-1]); 
       t[LINE_MAX_SIZE] = 0; 
       strcpy(array[j-1], array[j]); 
       strcpy(array[j], t); 
      } 
     } 
    } 
} 

    unsigned long int filelinecount = 10; 
    char **array = (char**)malloc(filelinecount * sizeof(char*)); 
    char singleline[LINE_MAX_SIZE]; 

    int i = 0; 
    for(i=0; i<filelinecount; i++) 
    { 
     fgets(singleline, LINE_MAX_SIZE, fileIN); 
     array[i] = (char*) malloc (LINE_MAX_SIZE * sizeof(char)); 
     singleline[LINE_MAX_SIZE] = '\0'; 
     strcpy(array[i], singleline); 

    } 

    sortfile(array, filelinecount); 

    for(i=0; i<filelinecount; i++) 
    { 
     printf("%s\n", array[i]); 
    } 

Ok Я вставит мой ВЕСЬ код:

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

#define MAX_LINE 4096 

unsigned long int lineCountFile(const char *filename) 
{ 
    FILE *fp = fopen(filename, "r"); 
    unsigned long int linecount = 0; 
    int c; 
    if(fp == NULL){ 
     fclose(fp); 
     return 0; 
    } 
    while((c=fgetc(fp)) != EOF) 
    { 
     if(c == '\n') 
      linecount++; 
    } 
    fclose(fp); 
    return linecount; 
} 

void sortfile(char **array, int linecount) 
{ 
    int i, j; 
    char t[MAX_LINE]; 

    for(i=1;i<linecount;i++) 
    { 
     for(j=1;j<linecount;j++) 
     { 
      if(strcmp(array[j-1], array[j]) > 0) 
      { 
       strcpy(t, array[j-1]); 
       strcpy(array[j-1], array[j]); 
       strcpy(array[j], t); 
      } 
     } 
    } 
} 

int main(int argc, char **argv) 
{ 
    char *in = "in.txt", *out = "out.txt"; 

    FILE *fileIN, *fileOUT; 

    fileIN = fopen(in, "r"); 
    if(!fileIN) 
    { 
     exit(-1); 
    } 

    unsigned long int linecount = lineCountFile(in); 
    linecount += 1; 

    char **array = (char**)malloc(linecount * sizeof(char*)); 
    char singleline[MAX_LINE]; 

    int i = 0; 
    while(fgets(singleline, MAX_LINE, fileIN) != NULL) 
    { 
     array[i] = (char*) malloc (MAX_LINE * sizeof(char)); 
     singleline[MAX_LINE] = '\0'; 
     strcpy(array[i], singleline); 
     i++; 
    } 

    sortfile(array, linecount); 

    for(i=0; i<linecount; i++) 
    { 
     printf("%s\n", array[i]); 
    } 

    fileOUT = fopen(out, "w"); 
    if(!fileOUT) 
    { 
     exit(-1); 
    } 

    for(i=0; i<linecount; i++) 
    { 
     fprintf(fileOUT, "%s", array[i]); 
    } 

    fclose(fileIN); 
    fclose(fileOUT); 

    for(i=0; i<linecount; i++) 
    { 
     free(array[i]); 
    } 
    free(array); 

    return 0; 
} 
+0

Похоже, вам нужно установить условное обозначение, когда вы нажмете новую новую строку. Вы можете сделать это, прочитав EOF/EOT. – Magn3s1um

+3

Имеет ли ваш файл ровно * filelinecount * lines (10)? Лучше было бы читать, пока 'fgets()' не вернет NULL. –

+0

Вы пытались просто прочитать данные и распечатать их немедленно, чтобы проверить правильность чтения данных? –

ответ

1

Ваш код работает отлично на моей машине ...

Просто к сведению, fgets будет читать newline символ \ n тоже в ваших переменных, поэтому, когда вы печатаете их как printf ("% s \ n", myvariable), у вас будет пустая строка между каждой строкой вывода.

Кроме того, после того, как последняя строка читается, он также будет читать EOF и, вы не должны увеличивать свой LineCount переменной, иначе вы получите Segfault.

Cheers

Смежные вопросы