【问题标题】:Problems with a simple text file line counter in CC中简单文本文件行计数器的问题
【发布时间】:2014-07-14 18:08:33
【问题描述】:

基本上,我有这个函数可以计算文本文件中的行数,这让我很头疼。它就像一个小文件的魅力(比如 50000 行)。但是,由于某种原因,当我尝试计算具有 100 万行的文件中的行数时,会出现分段错误错误。这是代码:

int countlines(char *filename)
{
    // count the number of lines in the file called filename
    FILE *fp = fopen(filename,"r");
    int ch=0;
    int lines=0;

    if (fp == NULL)
        return 0;

    while ((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n')
            lines++;
    }
    fclose(fp);
    return lines;
}

老实说,我已经尝试过上千种变体,但我不知道出了什么问题。它达到了 1000000 的行数,但随后它给了我一个分段错误错误。任何帮助将不胜感激!

编辑:既然每个人都说它对他们有用,我将向你展示我的主要功能。

int main(int argc, const char * argv[])
{
    int X_len = countlines("/homes/myworkspace/X.txt");
    int X[X_len][4];
    printf("\n X_len = %d",X_len);
}

【问题讨论】:

  • 您正在读取的文件有多大(以字节为单位)?可能是文件内的位置溢出了最大整数值,导致读取位置为负数。
  • @Mr.Llama 我想文件的行数可能超过2147483647 行(不是字符,),但我更倾向于相信调用者此函数返回后出现故障。这东西需要调试器时间。
  • 另外值得注意的是,这不考虑文件中的最后一行 not 以换行序列结尾。例如:not 以换行序列结尾的单行文件实际上将返回 zero
  • 制作了一个 919MB 的文本文件,包含 101399226 行,对我来说很好。
  • 您发布的代码很好。问题出在其他地方。

标签: c line-count


【解决方案1】:

这就是问题

int X[X_len][4];

当 X_len 大于 1000000 时,您没有足够的内存用于 (stack) 数组。

尝试动态分配(堆)代替

int (*X)[4];
X = malloc(X_len * sizeof *X);
if (X == NULL) /* error */;
// ...
free(X);

【讨论】:

  • 那么我还能将 X 作为二维数组访问吗?即 X[index1][index2]?我是 C 的新手,从未以这种方式使用过 malloc。我也有 3D 数组,这确实会使我访问数组的方式复杂化
  • 是的,您可以将X 作为二维数组访问。您可以对 3D 或更大的数组执行相同的操作,但它会很快变得笨拙。也许考虑一个结构的链表?
【解决方案2】:

我想说问题就在这里:

 int X[X_len][4];

这会在堆栈上分配内存,这可能只有 4MB,这可以解释在 1 000 000 行之后失败。

我建议在堆上分配它:

int *X = (int*)malloc(X_len * sizeof(int) * 4);

【讨论】:

  • 不要转换malloc()的返回值。它充其量是多余的,它可能会隐藏 C 编译器本来会捕获的错误。
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2011-05-17
  • 2011-09-20
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多