【问题标题】:C getting number of lines in a text file of wordsC获取单词文本文件中的行数
【发布时间】:2012-09-16 12:43:27
【问题描述】:

所以我试图获取文本文件中的行数,每个单词在一个新行上。到目前为止我有这个方法...

char * getS(char *fileName){
    FILE *src;
    if((src = fopen(fileName, "r")) == NULL){
        printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
        exit(-1);
    }
    char *get = ".";        

    int c = 0;
    char ch = 'x';
    while(ch!=EOF) {
        ch = fgetc(src);
        if(ch == '\n')  c++;
    }
    fseek(src, 0, SEEK_SET);
    printf("%i",c);
    int random = rand() % (c - 1);
    return get;
}

由于某种原因,如果我在 while 中间放一个 ch 的 printf,它会给我正确的行数,否则它是 7801729。

另外,我如何制作一个从 0 到行数的随机整数?在 C 中使用 random 的概念现在让我很困惑。

提前致谢!

【问题讨论】:

  • 您的意思是在c 的值之后添加一个换行符吗? printf("%i\n", c);
  • P.S.别忘了fclose(src)!并且将本地范围的指针返回到临时值可能不是一个好主意。
  • 好的,这些值是否与文件中正确的行数相对应? (可能一个接一个)
  • 它是关闭的,因为如果文件不以换行符结尾,您当前不认为最后一行是有效的。只有你可以回答你的其他问题。您很可能会使用其他文件名额外调用该函数 3 次。
  • 至于您问题的随机部分,请确保使用以下内容初始化随机数生成器:srand(time(NULL));

标签: c pointers random character line


【解决方案1】:

我认为 fgetc() 返回一个 int 但您将返回的值填充到一个 char 中(而不将其转换为 char),因此您将返回的 int 的第一个字节放在正确的位置(在您的 ch 变量中) 但额外的三个字节溢出到您的 c 变量中,该变量在堆栈上与 ch 相邻定义。当您增加 c 时,它会增加第一个字节(这表明您在大端机器上)但是 int 中额外的三个字节不会受到影响,并且会因 getc() 返回的覆盖而损坏。这就是为什么您的答案中的第一个字节看起来正确的原因。尝试将 ch 定义为 int,我敢打赌您的问题会消失(尽管您可能需要添加一些转换以避免编译器错误/警告)。

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多