2010-01-26 58 views
5

怎么能指望你在每行的字符或数字的数量?有没有像EOF那样更像线的末端?查找行大小

回答

5

您可以通过在该行的每个字符迭代,不断递增的计数器,直到最后的行('\n')遇到。确保打开文本模式("r"),而不是二进制模式("rb")文件。否则,流不会自动将不同平台的行结束序列转换为'\n'字符。

下面是一个例子:

int charcount(FILE *const fin) 
{ 
    int c, count; 

    count = 0; 
    for(;;) 
    { 
     c = fgetc(fin); 
     if(c == EOF || c == '\n') 
      break; 
     ++count; 
    } 

    return count; 
} 

下面是一个例子程序来测试上述功能:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE *fin; 

    fin = fopen("test.txt", "r"); 
    if(fin == NULL) 
     return 1; 

    printf("Character count: %d.\n", charcount(fin)); 

    fclose(fin); 
    return 0; 
} 
+0

你并不需要逐个字符地获取新行的索引。您可以使用strcspn()来查找'\ n'的索引。 (请参阅http://stackoverflow.com/questions/4824/string-indexof-function-in-c) – David 2010-01-26 02:32:20

+0

strcspn()和strspn()不从文件读取。要使用它们,您必须将整行读入一个字符串,然后重新遍历它以找到'\ n'字符。这效率较低。当然,这取决于MRP如何做他的文件IO代码。 – Sam 2010-01-26 02:34:48

+0

是的,这段代码的确有帮助,但我不得不改变一些事情。但我更好地了解这是如何工作的。谢谢 – MRP 2010-01-26 03:22:51

2

关于逐行读取文件中的行,看看fgets

char *fgets(char *restrict s, int n, FILE *restrict stream); 

的与fgets()函数须从流中读出字节 入指向的数组 由s,直到n-1个字节被读入,或 被读出并传送到 S,或遇到的文件结束条件是 。该字符串是 以空字节结尾。

这里唯一的问题可能是如果您不能保证文件中的最大行大小。如果是这种情况,则可以迭代字符,直到看到换行。

关于行末:

简短的回答:\n是换行字符(也称为换行)。

朗的答案,从维基百科:

系统基于ASCII或(十进制行 饲料的0x0A,10)兼容的 字符集要么LF或CR (回车,0X0D,13十进制) 单独,或CR接着LF (CR + LF,0X0D的0x0A);请参阅下面的 历史原因CR + LF 约定。这些字符在打印机命令基于 :线料 表明,纸 一个行应送出打印机,和一个 回车表明 打印机滑架应该返回到开始 当前行的。

* LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others 
* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS 
* CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 

但因为你不太可能与仅使用回车,找换行应该是精细的表示来工作。

+0

洙可以使一个循环,直到炭= \ n – MRP 2010-01-26 02:24:06

+0

右[15个字符] – danben 2010-01-26 02:25:27

+0

FILE *中; in = fopen(“numbers.txt”,“r”); if(in!= NULL) \t { 是否使用fget直到\ n? – MRP 2010-01-26 02:26:14

1

\n是C中的换行字符在其它语言,如C#,则可能会使用类似C#的Environment.EndLine来克服平台困难。

如果您已经知道您的字符串是一行(我们称之为行),请使用strlen(line)来获取其中的字符数。如果以'\n'结尾,则减1。

如果字符串中有新的行字符,则需要将它拆分为新行字符,然后在每个子字符串上调用strlen()

+0

他没有字符串,他有一个文件。 – danben 2010-01-26 02:34:40

1

如果以文本模式打开文件,即在fopen()的第二个参数中没有b,则可以逐个读取字符,直到找到'\n'以确定行大小。底层系统应该负责将行结束符转换为一个字符'\n'。在某些系统上,文本文件的最后一行可能不会以'\n'结尾,所以这是一种特殊情况。

伪代码:

count := 0 
c := next() 
while c != EOF and c != '\n'" 
    count := count + 1 

上述将计数在给定的行中的字符数。 next()是一个函数,用于返回文件中的下一个字符。

备选地,可以使用fgets()用缓冲:

char buf[SIZE]; 
count = 0; 
while (fgets(buf, sizeof buf, fp) != NULL) { 
    /* see if the string represented by buf has a '\n' in it, 
     if yes, add the index of that '\n' to count, and that's 
     the number of characters on that line, which you can 
     return to the caller. If not, add sizeof buf - 1 to count */ 
} 
/* If count is non-zero here, the last line ended without a newline */ 
+0

你可以解释SIZE ..我不知道如果这是一个Var或一个命令C使用。 – MRP 2010-01-26 02:51:17

+0

@MRP:'SIZE'是一个方便的正整数值,可以是预处理器宏或幻数。我没有给你一个完整的代码,因为我不确定这是否是一个家庭作业问题。 :-) – 2010-01-26 03:03:32

+0

那么如果SIZE是一个数字,我把..我需要它不会工作,然后因为我不知道大小.. – MRP 2010-01-26 03:06:14