【问题标题】:Sort lines from file C对文件 C 中的行进行排序
【发布时间】:2013-06-06 08:17:37
【问题描述】:

我只想从文件中读取 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;
}

【问题讨论】:

  • 听起来你需要设置一个条件来识别你何时点击最后一个新行。你也可以通过阅读 EOF/EOT 来做到这一点。
  • 您的文件是否正好有 filelinecount 行 (10)?在fgets() 返回NULL 之前最好阅读。
  • 您是否尝试过仅读取数据并立即将其打印出来以检查您是否正确读取数据?
  • t[LINE_MAX_SIZE] = 0; 数组越界
  • 不必要的t[LINE_MAX_SIZE] = 0;singleline[LINE_MAX_SIZE] = '\0';

标签: c file sorting


【解决方案1】:

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

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

此外,在读取最后一行后,它还将读取 EOF 并且您不应增加 linecount 变量,否则会出现段错误.

干杯

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 2018-04-29
    • 2020-10-09
    • 1970-01-01
    • 2015-09-13
    • 2020-07-30
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多