编写.txt文件统计程序遇字符数偏差问题,寻求排查解决方法
嘿,我来帮你揪出这个字符数差1的小问题~
首先,咱们先聚焦核心矛盾:你的测试文件实际是114个字符,但程序输出113,差了1个,结合你说的文件有2行,大概率是换行符的统计遗漏导致的,这是字符统计里很常见的坑!
为什么会差1?
我猜你的代码大概率是用BufferedReader.readLine()来读取每行内容的——这个方法会自动把每行末尾的换行符(\n或者Windows下的\r\n)去掉再返回给你。如果你的文件是2行,那中间就有1个换行符,而readLine()不会把这个换行符算进每行的长度里,直接统计每行长度的话,就会少算这1个字符,正好和你遇到的情况对上!
举个例子:假设你的测试文件内容是:
This is a test for counter function. Contents are subject to change.
This line tests if the line count is correct.
第一行末尾的换行符是单独的1个字符,但readLine()返回的第一行内容里没有它,你只统计了两行文本的长度,自然就少了1个字符。
怎么修复?
给你两种靠谱的解决方案:
方案1:给每行长度补加换行符(适合用readLine()的场景)
如果不想改读取方式,可以在统计每行长度的时候,手动加上换行符的长度。注意要考虑文件最后一行有没有换行符,避免多算:
public static void counter() { String file_name = "input.txt"; try (BufferedReader br = new BufferedReader(new FileReader(file_name))) { String line; int charCount = 0; int lineCount = 0; int wordCount = 0; boolean isWord = false; boolean hasLastNewLine = false; while ((line = br.readLine()) != null) { lineCount++; // 先加当前行的长度 charCount += line.length(); // 如果不是最后一行,加换行符的长度(Unix是1,Windows是2,这里先按Unix的\n举例) hasLastNewLine = br.ready(); if (hasLastNewLine) { charCount += 1; } // 单词统计逻辑(保持你原来的或者用这个通用的) for (char c : line.toCharArray()) { if (Character.isWhitespace(c)) { isWord = false; } else if (!isWord) { isWord = true; wordCount++; } } } // 输出结果 System.out.println("单词数: " + wordCount); System.out.println("行数: " + lineCount); System.out.println("字符数: " + charCount); } catch (IOException e) { e.printStackTrace(); } }
方案2:逐个字符读取(最准确,推荐)
直接用字节流逐个读取每个字符,包括换行符、空格、标点,这样完全不会遗漏任何字符,统计最准确:
public static void counter() { String file_name = "input.txt"; try (FileInputStream fis = new FileInputStream(file_name)) { int charCount = 0; int lineCount = 0; int wordCount = 0; boolean isWord = false; int prevChar = -1; int currentChar; while ((currentChar = fis.read()) != -1) { charCount++; // 处理行数:兼容Unix的\n和Windows的\r\n if (currentChar == '\n') { lineCount++; } else if (currentChar == '\r' && prevChar != '\n') { lineCount++; } // 处理单词数:遇到非空白字符且之前不在单词中时计数 if (Character.isWhitespace(currentChar)) { isWord = false; } else if (!isWord) { isWord = true; wordCount++; } prevChar = currentChar; } // 如果文件最后一行没有换行符,行数要加1 if (charCount > 0 && prevChar != '\n' && prevChar != '\r') { lineCount++; } // 输出结果 System.out.println("单词数: " + wordCount); System.out.println("行数: " + lineCount); System.out.println("字符数: " + charCount); } catch (IOException e) { e.printStackTrace(); } }
额外小检查
你可以用文本编辑器(比如Notepad++)打开你的input.txt,看状态栏显示的字符数(要选“包括换行符”的统计方式),确认实际字符数是不是真的114,这样能排除文件本身的问题。
内容的提问来源于stack exchange,提问作者M. Dingus

