正如vetzascoa和Stas Ivanov所提到的那样,代码中的异常可能是由未处理的空格和空字符串引起的。
要解决此问题,您可以按以下方式修改将测试数据写入文件的方法:
static string Delimiter => " ";
static string LineBreak => "\r\n";
static void WriteTestFile(string fileName,int dataLength = 100000,int dataMinvalue = 1,int dataMaxValue = 250,int lineBreakPosition = 25)
{
int iterator = 0;
string delimiter;
Random rndGenerator = new Random();
int randomNumber;
using (var fileStream = new FileStream(fileName,FileMode.Create,FileAccess.Write))
using (var streamWriter = new StreamWriter(fileStream))
{
while (iterator < dataLength)
{
randomNumber = rndGenerator.Next(dataMinvalue,dataMaxValue);
delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
streamWriter.Write($"{randomNumber}{delimiter}");
}
}
}
通过这种方式,可以避免每行末尾出现多余的空格。另外,请注意,FileStream
,StreamReader
和StreamWriter
是IDisposable
个对象。因此,它们在using(...)
或try/finally
块内should be used。
要读取文件并将其内容转换为List<int>
,可以使用以下代码:
static List<int> ReadTestFile(string fileName)
{
string fileContents;
using (var fileStream = new FileStream(fileName,FileMode.Open,FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
fileContents = streamReader.ReadToEnd();
}
var separators = string.Join("",LineBreak,Delimiter).ToCharArray();
var query = from item in fileContents
.Split(separators,StringSplitOptions.RemoveEmptyEntries)
select int.Parse(item);
return query.ToList();
}
使用StringSplitOptions.RemoveEmptyEntries
方法生成的exclude empty entries/substrings使用String.Split
选项拆分文件内容字符串。这将确保无错误的字符串到整数的转换。
下面,您可以找到解决问题的完整的最低限度的解决方案。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FileToListInt
{
class Program
{
static readonly string filePath = "randomNumbers.txt";
static string Delimiter => " ";
static string LineBreak => "\r\n";
static void WriteTestFile(string fileName,int lineBreakPosition = 25)
{
int iterator = 0;
string delimiter;
Random rndGenerator = new Random();
int randomNumber;
using (var fileStream = new FileStream(fileName,FileAccess.Write))
using (var streamWriter = new StreamWriter(fileStream))
{
while (iterator < dataLength)
{
randomNumber = rndGenerator.Next(dataMinvalue,dataMaxValue);
delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
streamWriter.Write($"{randomNumber}{delimiter}");
}
}
}
static List<int> ReadTestFile(string fileName)
{
string fileContents;
using (var fileStream = new FileStream(fileName,FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
fileContents = streamReader.ReadToEnd();
}
var separators = string.Join("",Delimiter).ToCharArray();
var query = from item in fileContents
.Split(separators,StringSplitOptions.RemoveEmptyEntries)
select int.Parse(item);
return query.ToList();
}
static void Main(string[] args)
{
// Writing data to a test file
WriteTestFile(filePath);
// Reading result into a List<int>
List<int> data = ReadTestFile(filePath);
// Checking the number of readings
Console.WriteLine(data.Count);
// Deleting test file
if (File.Exists(filePath))
File.Delete(filePath);
}
}
}
,
看着您遇到的错误,在我看来,您没有考虑换行符(至少我能够以此方式重现它)。
这是我对包含新行的文件的工作方式(我使用了 Split 的重载,该重载接受要分割的字符数组,此外,由于提供的 StringSplitOptions ):
using (var reader = new StreamReader(@"c:\temp\test.txt"))
{
var text = await reader.ReadToEndAsync();
var numbers = text.Split(new [] {' ','\n','\r' },StringSplitOptions.RemoveEmptyEntries).Select(word => Convert.ToInt32(word));
// do something with numbers (IEnumerable<Int32>)
}
上面的代码将数字存储到 IEnumerable 集合中。如果需要数组,则应调用 ToArray()。
,
我可以给你两个解决方案。
其中之一是修改用于创建带有数字文件的代码。
另一个是从您告诉我们的链接中修改您正在使用的代码。
当您将空白写入文件时,代码中的问题出在while循环内:
randomNumber = rnd.Next(1,250);
sw.Write(randomNumber);
sw.Write(" "); // create white space <------ this line
此行总是在数字后面写一个空格。这意味着您的文件将以空格结尾,而不是数字。这会导致该行出现异常
lists.Add(Convert.ToInt32(listInts[j]));
因为文件生成的listInts [j] =“”中的最后一行。
第一个可能的解决方案
当您要在文件中写入空白时,请仅在写入最后一个数字后才写入。
您的while循环应类似于以下内容:
while (count++ < 100000)
{
randomNumber = rnd.Next(1,250);
sw.Write(randomNumber);
if (count < 100000) //avoid write a white space if is last number to write
{
sw.Write(" "); // create white space
}
if(lines == 25) //formatting
{
sw.WriteLine("");
lines = 0;
}
lines++;
}
第二种可能的解决方案
在您用来读取文件的代码中,只需使用函数.Trim()拆分成数组,然后从每一行中删除空白即可。
String[] listInts = listLines[i].Trim().Split(' ');
代替当前行
String[] listInts = listLines[i].Split(' ');
本文链接:https://www.f2er.com/3085629.html