gpt4 book ai didi

c - 对文件 C 中的行进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:11 24 4
gpt4 key购买 nike

我只想从文件中读取 10 行,然后对它们进行排序并打印出来。但是我的代码有问题,因为当我有这样的文件时:

a
d
b

c

s

(注意'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]);
}

好的,我将粘贴我的完整代码:

#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;
}

最佳答案

您的代码在我的机器上运行良好...

请注意,fgets 会将换行符 字符\n 也读取到您的变量中,因此当您像 一样打印它们时printf("%s\n", myvariable),每行输出之间会有一个空行。

此外,在读取最后一行之后,它还会读取一个 EOF 并且你不应该增加你的 linecount 变量,否则,你会得到一个段错误.

干杯

关于c - 对文件 C 中的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com