Я просто хочу прочитать 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;
}
Похоже, вам нужно установить условное обозначение, когда вы нажмете новую новую строку. Вы можете сделать это, прочитав EOF/EOT. – Magn3s1um
Имеет ли ваш файл ровно * filelinecount * lines (10)? Лучше было бы читать, пока 'fgets()' не вернет NULL. –
Вы пытались просто прочитать данные и распечатать их немедленно, чтобы проверить правильность чтения данных? –