我试图从文件中取出数字(字符0-9)并将它们存储在内存中。
让我们说我们有一个名为" register" (并且只能(必须)最多保持5个字符)并且寄存器字符串将采用从文件中读取的数字,例如:
File1.txt:
门牌号码是10,价格是4000和3。
因此,注册表将填写以下内容:" 10400"
然后会对字符串执行一些逻辑,然后第一个字符串将从字符串中删除,所有内容都会向左移1,并且会添加文件中的另一个字符(数字),例如:
04000
然后......
40003
希望有人可以对此有所了解,并提供一些实现这一目标的方法:)
答案 0 :(得分:1)
好吧,如果你想从字符串中删掉第一个字符并在最后添加一个字符,你可以说:
string s = "10400";
string t = s.Substring(1) + "0";
这会给t = "04000"
。重复:
string u = t.Substring(1) + "3";
这会给u = "40003"
。
那么,你还想要什么?确定最终添加内容的逻辑是你的工作。
答案 1 :(得分:0)
行...
首先,FileStream和相关的StreamReader将允许您以几乎任何您想要的格式读取文件。这很重要,因为您的特定算法将决定检索方法。
将其煮沸,你想从文件中读取字符,当该字符是数字时,将其存储在寄存器中,继续以这种方式,直到寄存器中有五个数字字符。然后,你会做一些逻辑导致第一个数字不再有用,所以你截断它并得到下一个值。
这些方面的内容怎么样?
var register = new StringBuilder();
using(var stream = File.Open("File1.txt"))
{
bool ended, fileEnded;
int buffer;
while(!ended)
{
while(register.Length < 5 && !fileEnded)
{
buffer = stream.ReadByte();
if(buffer == -1)
{
fileEnded = true;
break;
}
var myChar = (char)buffer;
if(Char.IsNumber(myChar))
StringBuilder.Append(myChar);
}
//at this point you have 5 characters in register (or have run out of file).
//perform your logic, then remove the front character
register.Remove(0,1);
//repeat the loop. You won't get any more new characters once you reach the end of file,
//but the main loop will keep running until you set ended to true
if(WereDone())
ended=true;
}
stream.Close();
}
您还可以将整个文件读入一个字符串变量,然后应用一个可以找到数字字符的正则表达式,将它们连接到一个大缓冲区,然后从中填充您的寄存器。对于小文件来说,这是一种更好的方法,但是这个文件适用于任何文件大小。
答案 2 :(得分:0)
您可以像这样创建一个List的扩展方法:
static class Helper
{
public static void Push<T>(this List<T> list, T item)
{
if (list.Count == 5)
list.RemoveAt(0);
list.Add(item);
}
}
然后您就可以使用它:
List<char> queue = new List<char>(5);
queue.Push('1');
queue.Push('0');
queue.Push('4');
queue.Push('0');
queue.Push('0');
后续调用Push将删除第一个字符并添加最后一个字符
queue.Push('1');
答案 3 :(得分:0)
我可能会提供一种方法来将正确的字符串提取到值中。请参阅下面的示例:
static string FetchRegister(string Source, int Max, int StartIndex)
{
string Register = string.Empty;
int RegisterIndex = 0;
for (int i = 0; i < Source.Length; i++)
{
if (char.IsNumber(Source[i]))
{
if (RegisterIndex >= StartIndex)
{
Register += Source[i].ToString();
if (Register.Length == Max)
{
return Register;
}
}
RegisterIndex += 1;
}
}
return Register;
}