使用c计算文件中的新行c

问题描述:

正文:Hi\r\n how is it going \r\nareyouoay\r\n;答案应该是3,新的生产线并不意味着\n这意味着严格\r\n,所以只是有\n不好使用c计算文件中的新行c

,这里是我的尝试,我究竟做错了什么?

FILE *fp = fopen(fileName, "r"); 
int c, lastchar;   
int lineCount= 0; 
int i; 

while ((c=fgetc(fp)) != EOF) { 
    if (c == 'r' && lastchar == '\\' && c+1== '\\' && c+2=='n') 
     lineCount++; 
    lastchar = c; 
    i++; 
} 

该文本的输出应该是3。

+0

在您的文本中,\ n表示两个字符'\'和'n'连接,或者它表示单个字符'\ n'(ascii 10)? –

+0

“你好\ n如何\ r \ nare \ ryou \ r \ n”的答案是 –

+0

答案是两个 – user1888502

如果你必须在同一时间做你的搜索字符,你可以使用类似下面的代码

int c;   
int lineCount= 0; 
int i = 0; 
char next[] = {'\\', 'r', '\\', 'n' }; 
while ((c=fgetc(fp)) != EOF) { 
    if (c != next[i]) { 
     i = 0; 
    } 
    else { 
     if (i == sizeof(next) - 1) { 
      i = 0; 
      lineCount++; 
     } 
     else { 
      i++; 
     } 
    } 
} 

为界输入文件的大小,你会更好读取整个文件到内存中,然后使用strstr。或者,对于较大的输入,将块读入内存中,使用strstr并考虑如何避免在块边界上丢失匹配。

+0

只是'\ n'也会工作 –

+0

那不是我想要做的,我想专门计算\ r \ n并将其作为一个字符串计算,因此如果单个行有Hi \ r \ n它怎么样\ r \ nareyouoay \ r \ n输出应该是3,即使它全部在一行上。要做到这一点,我需要阅读每个字符,并确保所有字符都发生。 – user1888502

+0

@simonc请阅读以上 – user1888502

你做错了什么是,\n是1个字符,不是多个字符。

因此来算,你得行数做到这一点:

while ((c = fgetc(fp))!= EOF){ 
    if(c == '\n') lineCount++; 
} 

printf("No. of lines = %d", lineCount); 
+0

那不是我想要做的,我想特别指出\ r \ n并将其作为一个字符串计算,因此如果单个行有Hi \ r \ n它将如何发生\ r \ n \ n \ n \ r \ n输出应该是3,即使它全部在一行上。要做到这一点,我需要阅读每个字符,并确保所有字符都发生。在我的方法中,计算线的方式不是\ n,\ n \ n将是文本,但如果用户有\ r \ n,则表示新行 – user1888502

+0

请阅读以上 – user1888502

字符\r\n是单个字符,所以读你输入的时候,你不会找到他们\\字符。而且,如果你在Windows上,你应该用模式"rb"打开你的文件以二进制模式打开它,否则运行时将去掉\r字符。

FILE *fp = fopen(fileName, "rb"); 
int lastchar = 0; 
int lineCount = 0; 
int c; 

while ((c = fgetc(fp)) != EOF) { 
    if (lastchar == '\r' && c == '\n') 
     lineCount++; 
    lastchar = c; 
} 

printf("line count: %d\n", lineCount); 

如果你真的想算四个大字\\r\\n继承,那么你可以这样做的(似乎很奇怪,但也许你的输入已经引用的字符序列):

FILE *fp = fopen(fileName, "rb"); 
char prevchars[4] = { 0, 0, 0, 0 }; 
char fingerprint[4] = { '\\', 'r', '\\', 'n' }; 
int lineCount = 0; 
int c, i; 

while ((c = fgetc(fp)) != EOF) { 
    if (memcmp(prevchars, fingerprint, 4) == 0) 
     lineCount++; 
    for (i = 1; i < 4; i++) 
     prevchars[i - 1] = prevchars[i]; 
    prevchars[3] = (char)c; 
} 

printf("line count: %d\n", lineCount); 
+0

这应该是一个正确的答案,但问题是试图问如何搜索''\\ r \\ n“'即4个独立的字符。其他两个答案都采用了与您的方法相同的方法,因此问题不尽如人意。 – simonc