在每行文件中获得数字的总和

时间:2011-09-29 09:37:15

标签: c# streamreader

我有一个文件,其中有一些数字我想在每行中排名第一,第二位。我的文件中有数字:

-944 -857
-158 356
 540 70
 15 148

例如我想总结-944和-857我该怎么办? 我做了它像下面的代码检查数字和输出是-158和15(它没有显示-944和540 !!!):

        StreamReader ar = new StreamReader(@"C:\Users\arash\Desktop\problem1 (3).in");
        while (ar.ReadLine() != null)
        {
            string[] spl = ar.ReadLine().Split(' ');
            MessageBox.Show(spl[0]);

        }

4 个答案:

答案 0 :(得分:4)

您正在while检查中读取一行,然后再次解析该值 - 这就是为什么它似乎只读取偶数行。

建议的解决方案:

StreamReader ar = new StreamReader(@"C:\Users\arash\Desktop\problem1 (3).in");
// Prepare the first line.
string line = ar.ReadLine();
while (line != null) {
    // http://msdn.microsoft.com/en-us/library/1bwe3zdy.aspx
    string[] spl = line.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries);
    MessageBox.Show(spl[0]);
    // Prepare the next line.
    line = ar.ReadLine();
}

更新:使用string.Split()的重载,不会返回空结果和最多2个值(1和字符串的其余部分)。

答案 1 :(得分:3)

试试这个(精简版):

    StreamReader ar = new StreamReader(@"C:\Users\arash\Desktop\problem1 (3).in");
    while ((string line = ar.ReadLine()) != null)
    {
        string[] spl = line.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries);
        MessageBox.Show(spl[0]);
    }

您正在阅读两次但仅使用第二次阅读。

注意:您也没有从行的开头修剪空格,因此如果数据具有前导空格,您将丢失数字(如示例所示)。

答案 2 :(得分:2)

你在你的while条件下再做一个readline,然后再在你的while范围的主体中,因此跳过1条readline指令(在while条件下)。试试这个:

StreamReader ar = new StreamReader(@"C:\Users\arash\Desktop\problem1 (3).in");
string s = ar.ReadLine();
while (s != null)
{
    //string[] spl = s.Split(' ');
    // below code seems safer, blatantly copied from one of the other answers..
    string[] spl = s.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries);
    MessageBox.Show(spl[0]);
    s = ar.ReadLine();
 }

答案 3 :(得分:2)

    StreamReader ar = new StreamReader(@"C:\Users\arash\Desktop\problem1 (3).in");
    // Load a line into s
    string s = ar.ReadLine();
    while (s != null)
    {
        // Split on space
        string[] spl = s.Trim(' ').Split(' ');
        // Declare two variables to hold the numbers
        int one;
        int two;
        // Try to parse the strings into the numbers and display the sum
        if ( int.TryParse( spl[0], out one ) && int.TryParse( spl[1], out two) ) {
            MessageBox.Show( (one + two).ToString() )
        }
        // Error if the parsing failed
        else {
            MessageBox.Show("Error: Numbers were not in integer format");
        }
        // Read the next line into s
        s = ar.ReadLine();

    }