我有一阵的 char* 在一个文件。我工作的公司的商店平面文件中的数据..有时候数据进行排序,但有时它不是。我想排序的数据文件。

现在我可以写代码要做到这一点,从头开始。是否有一个更简单的方法?

当然,在地方进行排序将是最好的选择。我工作上的大型文件和具有的小羊。但我会考虑所有的选项。

所有串是一样的长度。

这是一些样品数据:

the data is of fixed length
the Data is of fixed length
thIS data is of fixed lengt

这将表示的三个记录的长度为28。该应用程序知道的长度。每个记录结束CRLF(\r\n),虽然它不应该的问题,为此进行排序。

有帮助吗?

解决方案

template<size_t length> int less(const char* left, const char* right) {
    return memcmp(left, right, length) < 0;
}

std::sort(array, array + array_length, less<buffer_length>);

其他提示

使用GNU排序程序(外部)如果不能拟合数据到RAM:它将排序任意大小的文件和该文件时,创建过程的小的额外成本

可以使用的算法在STL阵列上本机数据类型,而不仅仅是上STL容器。另外建议使用std ::排序将无法正常工作,但是贴出来,因为STRCMP返回时字符串是不一样的,计算结果为适用于所有比较的价值不只是如果左侧小于右侧右手边 - 这是性病::排序想要的东西;二进制谓词返回左手侧的真实小于右侧。

此工作的:

struct string_lt : public std::binary_function<bool, char, char>
{
    bool operator()(const char* lhs, const char* rhs)
    {
        int ret = strcmp(lhs, rhs);
        return ret < 0;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    char* strings [] = {"Hello", "World", "Alpha", "Beta", "Omega"};
    size_t numStrings = sizeof(strings)/sizeof(strings[0]);

    std::sort(&strings[0], &strings[numStrings], string_lt());

    return 0;
}

boost::bind可以做到这一点:

// ascending
std::sort(c, c + size,  boost::bind(std::strcmp, _1, _2) < 0); 

// descending
std::sort(c, c + size,  boost::bind(std::strcmp, _1, _2) > 0); 

修改:字符串是不是空终止:

// ascending
std::sort(c, c + array_size,  boost::bind(std::memcmp, _1, _2, size) < 0); 

// descending
std::sort(c, c + array_size,  boost::bind(std::memcmp, _1, _2, size) > 0); 

也许最简单的方法是使用过的旧文件stdlib.h函数的qsort。 这应该工作:

qsort( array, num_elements, sizeof( char* ), strcmp )

请注意,这是标准的C和只适用可靠,英文文本。

如果你有字符串对象的列表,然后其他的事情在C ++可能

如果您是在Linux和编写GTK或Qt应用程序,那么我会建议你看看这些库提前。

如果文件很大,不适合在RAM中,你可以使用斌/桶排序分割数据分成较小的文件,并在最后的结果文件聚集的碎片。其他的回答告诉你如何排序每一个人斗文件。

在规范的方法进行排序字符串的C中的阵列,因此可用的但不一定推荐的方法在C ++这样做,使用了一个间接层来strcmp()

static int qsort_strcmp(const void *v1, const void *v2)
{
    const char *s1 = *(char * const *)v1;
    const char *s2 = *(char * const *)v2;
    return(strcmp(s1, s2));
}

static void somefunc(void)   // Or omit the parameter altogether in C++
{
    char **array = ...assignment...
    size_t num_in_array = ...number of char pointers in array...
    ...
    qsort(array, num_in_array, sizeof(char *), qsort_strcmp);
    ...more code...
}

几件事情我想到:

  1. 如果你的数据是太大,不适合进入存储器,你可能想到的只是建立一个索引存的文件偏移,然后存储器的映射的文件访问串(取决于你的OS)。
  2. 在地方是需要一个 很多 存副本。如果可以,用一个外壳。然后,一旦你知道的终了,这是很容易重新排序的串地在线性时间。
  3. 如果串都是一样的长度, 真的 希望一个基排序。如果你不熟悉的基数进行排序,这基本想法:比较--基于排序(这是什么 std::sort, qsort, 和任何其他一般用途分类)总是需要O(N记录N)的时间。基排序比较一个单一的数字在一段时间(在开始 str[0] 结束 str[K-1] 一个K-lenth string),以及整体可以只需要O(N)时执行。

咨询Internetfor更详细的说明的基排序的算法比我可以提供。除了我所说的,我将避免所有其他的解决方案,使用标准libarary排序设施。他们不是设计你的特别的问题,不幸的。

您可能想看看内存映射文件(见 HTTP://en.wikipedia。组织/维基/内存mapped_file所),MMAP()函数( HTTP:// EN。在POSIX的投诉操作系统wikipedia.org/wiki/Mmap )。你会实质上得到一个指向连续内存表示文件的内容。

在良好的一面是,操作系统将照顾该文件的装载部分到存储器,并再次卸载它们,根据需要。

一个缺点是,你需要解决某种形式的文件锁定,以避免损坏,如果有多个进程很可能访问的文件。

另一个缺点是,这并不能保证良好的性能 - 要做到这一点,你需要一个排序算法,试图避免不断地加载和卸载的网页(当然,除非你有足够的内存来加载整个文件到内存)。

希望这给了你一些想法!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top