10

当我尝试运行我的程序时,打印的行数错误。

LINES: 0

这是输出,虽然我的 .txt 文件中有五行

这是我的程序:

#include<stdio.h>
#include<stdlib.h>

int countlines(char *filename);

void main(int argc, char *argv[])
{
  printf("LINES: %d\n",countlines(argv[1]));         
}


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;

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

我确信这是一个简单的错误,但我是编程新手。任何帮助将不胜感激。

4

8 回答 8

29
while(!feof(fp))
{
  ch = fgetc(fp);
  if(ch == '\n')
  {
    lines++;
  }
}

但请注意:为什么“while (!feof (file))”总是错的?.

于 2012-10-04T18:37:19.270 回答
4

你声明

int countlines(char *filename)

进行char *辩论。

你这样称呼它

countlines(fp)

传入 FILE *.

这就是为什么你得到那个编译错误。

您可能应该将第二行更改为

countlines("Test.txt")

因为您在countlines中打开文件

您当前的代码正在尝试在两个不同的位置打开文件。

于 2012-10-04T18:05:46.380 回答
4

你有一个 ; 在结束时if。改变:

  if (fp == NULL);
  return 0;

  if (fp == NULL) 
    return 0;
于 2012-10-04T18:53:57.407 回答
3

您正在打开一个文件,然后将文件指针传递给一个只需要文件名来打开文件本身的函数。您可以简化呼叫;

void main(void)
{
  printf("LINES: %d\n",countlines("Test.txt"));
}

编辑:您正在改变问题,因此很难回答;一开始你main()改错了,你忘了第一个参数是argc,所以它崩溃了。现在你有问题;

if (fp == NULL);   // <-- note the extra semicolon that is the only thing 
                   //     that runs conditionally on the if 
  return 0;        // Always runs and returns 0

它将始终返回 0。删除那个额外的分号,你应该得到一个合理的计数。

于 2012-10-04T18:06:28.770 回答
0

我没有立即看到任何会导致分段错误的明显内容。我唯一的怀疑是你的代码在你运行它时期望得到一个文件名作为参数,但如果你不传递它,它无论如何都会尝试引用一个。

argv[1]在不存在时访问导致分段错误。在尝试引用它们之前检查参数的数量通常是一种很好的做法。您可以通过使用以下函数原型来执行此操作main(),并检查它argc是否大于 1(简单地说,它将指示 argv 中的条目数)。

int main(int argc, char** argv)

一般来说,找出导致段错误的最佳方法是使用调试器。如果您在 Visual Studio 中,请在 main 函数的顶部放置一个断点,然后在启动程序时选择“带调试运行”而不是“不带调试运行”。它将在顶部停止执行,并让您逐行执行,直到您发现问题。

如果您在 Linux 中,您只需获取核心文件(名称中将包含“核心”)并使用gdb(GNU 调试器)加载它。它可以给你一个堆栈转储,它将直接指向导致分段错误发生的行。

编辑:我看到你改变了你的问题和代码。所以这个答案可能不再有用了,但无论如何我都会把它作为一个很好的建议,看看我能否很快解决修改后的问题)。

于 2012-10-04T18:46:47.737 回答
0

这是我的功能

char *fileName = "input-1.txt";
countOfLinesFromFile(fileName);

void countOfLinesFromFile(char *filename){
FILE* myfile = fopen(filename, "r");
int ch, number_of_lines = 0;
do
{
    ch = fgetc(myfile);
    if(ch == '\n')
        number_of_lines++;
}
while (ch != EOF);
if(ch != '\n' && number_of_lines != 0)
    number_of_lines++;
fclose(myfile);
printf("number of lines in  %s   = %d",filename, number_of_lines);

}

于 2017-11-27T17:26:21.267 回答
0

接受的答案需要 34 (!) 秒来计算我的 Core i9 CPU 和 SSD 驱动器上 1.3 Gb CSV 文件中的行数。请不要fgetc用于读取大文件。这是非常缓慢的。以下代码片段在 300 毫秒内完成了这项工作:

#include <stdio.h>

#define BUF_SIZE 65536

int count_lines(FILE* file)
{
    char buf[BUF_SIZE];
    int counter = 0;
    for(;;)
    {
        size_t res = fread(buf, 1, BUF_SIZE, file);
        if (ferror(file))
            return -1;

        int i;
        for(i = 0; i < res; i++)
            if (buf[i] == '\n')
                counter++;

        if (feof(file))
            break;
    }

    return counter;
}
于 2022-01-14T10:13:59.167 回答
-1

这是 C/C++ 中的完整实现

#include <stdio.h>

void lineCount(int argc,char **argv){

        if(argc < 2){
             fprintf(stderr,"File required");
             return;
        }
        FILE *fp = fopen(argv[1],"r");



        if(!fp){
            fprintf(stderr,"Error in opening file");
            return ;      
        }

        int count = 1; //if a file open ,be it empty, it has atleast a newline char
        char temp;

        while(fscanf(fp,"%c",&temp) != -1){
                if(temp == 10) count++;
        }

        fprintf(stdout,"File has %d lines\n",count);
   }

int main(int argc,char **argv){

        lineCount(argc,argv);
        return 0;
}
https://github.com/KotoJallow/Line-Count/blob/master/lineCount.c
于 2019-03-23T20:09:56.573 回答