【问题标题】:Why isn't my while loop returning the correct values from a file?为什么我的 while 循环没有从文件中返回正确的值?
【发布时间】:2019-10-05 20:40:45
【问题描述】:

我正在尝试编写一个简单的程序来计算 | 的数量在管道分隔值文件中出现特定输入值之前出现在一行中的管道。

我尝试创建一个 while 循环,该循环遍历文件的每个字符,并且每次 FileInputStream.read() 的值返回 124(管道的字节值)时递增 1,但如果 FileInputStream.read 则重置为 0 () 返回 10(新行的字节值)并增加行计数器 + 1。

while((filereader=fis.read())!=searchValue){

        int filereader = byteVal;
        if(byteVal == 10)
        {
            lineCt++;
            finalPipCT = 0;

        if(byteVal == 124)
        {
           pipeCtr++;
        }
        finalPipCT = finalPipCt + lineCt;
        System.out.println("Data: " + sippyStraw + "\t" + (char)sippyStraw);


  }
  System.out.println("Total | in line: "+ finalPipCT );
  System.out.println("Total lines til value: "+ lineCt );
}

如果文本文件是这样的:

|a|b|c|

|d|e|f

|g|h|i|j|

|k|l|m||n|

并且 searchValue 是“h”,我希望它返回:

总计 |排队:2
总行数 til 值:3

在值 h 匹配之前,从所述行的开头开始在该行中出现的管道数。

【问题讨论】:

  • 您没有正确关闭您的第一个 if。投票结束为错字。
  • 您的代码无法编译。你是如何测试这个的?

标签: java loops counter


【解决方案1】:

这对我有用:

    String text = "|a|b|c|\n" + 
                "|d|e|f\n" + 
                "|g|h|i|j|";
    int lineCt = 1;
    int finalPipCT = 0;
    int searchVal = 104;

    for(int i = 0; i < text.length() && text.charAt(i) != 'h'; i++) {
    //while (scanner.hasNextByte() && (scanner.nextByte() != searchVal)) {
        int byteVal = (byte) text.charAt(i);

        if(byteVal == 10) {
                lineCt++;
                finalPipCT = 0;
        }

        if(byteVal == 124) {
            finalPipCT++;
        }   
    }

    System.out.println("Total | in line: "+ finalPipCT );
    System.out.println("Total lines til value: "+ lineCt );

我删除了一些东西,比如 "System.out.println("数据:" + sippyStraw + "\t" + (char)sippyStraw);"

而“finalPipCT = finalPipCt + lineCt;”

我还使用了字符串而不是您的文件。

【讨论】:

  • 感谢您的周到和翔实的回答。当在 txt 文件而不是字符串上使用 BufferedReader 时,同样的脚本会起作用吗?
  • 我不明白为什么不这样做。您必须使用 while 循环而不是 for 循环。
【解决方案2】:

首先是一些明显的问题:

  • int filereader = byteVal; # 是向后的
  • 第一个“if”语句缺少结束语句括号。
  • finalPipCT = finalPipCt + lineCt; # finalPipCt 应该是 finalPipCT

更好的解决方案是一次读取流一行(BufferedReader),然后解析行中的字符。原因是您假设行分隔符是 10。对于 Windows 文件,它是不同的。如果您使用缓冲读取器读取一行,则将为您处理 EOL。

您的 while 循环应该读取行,直到值为 null。即使在文件结束后,您的代码也会尝试读取一个字节(如果它从未找到搜索字节)。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多