ファイルから 10 行を読み取り、並べ替えて印刷したいだけです。しかし、そのようなファイルがある場合:
a
d
b
c
s
(「s」の後の改行に注意してください)ファイルをソートしますが、「s」を2回出力します:
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;
}