问题 随机文件访问

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
我是C#编程的新手。我一直在使用Visual Basic。
当我访问我的文件时,我使用:Visual Basic的FileOpen,FileGet Fileput和FileClose功能。

c#中的类似?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,587
地点
悉尼,澳大利亚
编程经验
10+
无论如何,您不应该使用VB中的那些。他们是VB6的持有者。如果您使用的是.NET语言,那么有许多方法可以使用system.io命名空间中的文件。您可以创建一个Filestream以获取对文件的随机二进制访问权限。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,587
地点
悉尼,澳大利亚
编程经验
10+
你能指出一些例子吗?

没有特别,但它就像任何流一样。如果你要解释你想要实现的目标,你试图实现它以及如何达到期望,我们可能能够指向正确的方向。
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
我有文件中的数据。第一个数据字段具有用户ID 36个字符长,下一步是日期12个字符长,接下来一个用户名长,那么一个音符字段为4000个字符长。日期和用户名未加密,其他字段是。我需要阅读每个字段。每个字段都保存为字符串。

我会上载我的文件副本,但我看不到该怎么做。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,587
地点
悉尼,澳大利亚
编程经验
10+
我有文件中的数据。第一个数据字段具有用户ID 36个字符长,下一步是日期12个字符长,接下来一个用户名长,那么一个音符字段为4000个字符长。日期和用户名未加密,其他字段是。我需要阅读每个字段。每个字段都保存为字符串。
所以似乎你似乎是一个文本文件而不是二进制文件,所以你应该使用StreamReader或者可能是TextFieldParser而不是Filestream。实际情况下,StreamReader在引擎盖下创建FILESTREAM,并添加一些功能以将二进制数据转换为文本,TextFieldParser在引擎盖下创建StreamReader,并添加一些功能以将文本分隔为字段。如果您想要随机访问,那么您仍然需要访问FILESTREAM才能调用寻找或设置位置属性。作为一个例子,这里可以使用StreamReader读取记录的方式,假设行中断由回车返回/线馈送对组成:
private readonly int[] fieldWidths = {36, 12, 25, 4000};
private StreamReader reader;

private void OpenFile(string path)
{
    reader = File.OpenText(path);
}

private void CloseFile()
{
    reader.Close();
    reader = null;
}

private string[] ReadRecordAtIndex(int index)
{
    var recordLength = fieldWidths.Sum();

    // Move the file pointer to the start of the requested record.
    // The extra two characters is for the line break.
    reader.BaseStream.Position = index == 0
                                    ? 0
                                    : index*(recordLength + 2);

    var data = new char[recordLength];

    reader.Read(data, 0, recordLength);

    var startIndex = 0;
    var fields = new List<string>();

    foreach (var fieldWidth in fieldWidths)
    {
        fields.Add(new string(data, startIndex, fieldWidth));
        startIndex += fieldWidth;
    }

    return fields.ToArray();
}

我会上载我的文件副本,但我看不到该怎么做。
单击编辑器下的“Go Advanced”按钮,然后单击“管理附件”按钮附加文件。
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
谢谢,今天将花在学习和应用你发给我的东西。

我可能已经遗漏了一个重要的信息。我使用Visual C#与表单,文件中的数据来自该表单上的文本框。
读取数据时,它将被放入文本框中。
 

juggalobrotha

工作人员
加入
2011年4月23日
消息
177
地点
兰辛,MI;美国
编程经验
10+
这是一个从过去的一个话题,我也记得在vb6中做rand文件......他们也是屁股的痛苦。
我发现了一篇论文,讨论了如何用VB.NET执行此操作(应该很容易转换为C#以来,从今天的两种语言仅不同于语法,并且您知道VB6的VB): 如何在VB.NET中正确读取随机访问文件 - 堆栈溢出
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
我的项目文件

我附上了mydata项目。我没有删除BIN和Object文件夹,以担心删除错误的事情。
我试图将此项目从Visual Basic升级到C#。到目前为止,我有表单和按钮和文本框。
当表单加载时,我需要阅读前36个文本数据时,这是密码,然后我可以解除它并检查它。
这是我现在被困的地方。

这就是我现在拥有的:
system.io.StreamReader StreamReader = New StreamReader(@"C:\MyData.txt");

//从文件读取行
String text;
while((text = streesReader.readline())!= null)

//将读取行写入TextBox
textbox3.text = text;

//Close the file.
StreamReader.Close();

这是针对以行编写的文件,但这不是我所拥有的文件,所以它不起作用。它将数据变为textmox3,但这不是我需要的。

我没有尝试过的剩下的程序,我必须得到密码但首先完成,然后我可以加载其余的填充其他字段。
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
这似乎是它要工作的:

string boxtext = "";
使用(textreader Reader = file.opentext(@"C:\MyData.txt"))
{
char [] c = new char [5];
Reader.Readblock(C,0,5);
boxtext = boxtext + c;
}
this.textbox3.text = boxtext;

但它归还了这一点"System.Char[]" textBox3
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,587
地点
悉尼,澳大利亚
编程经验
10+
您需要考虑您使用的数据类型。这:
boxtext = boxtext + c;
将在该字符数组上隐式调用ToString,结果不是创建包含相同字符的字符串,而是创建包含类型名称的字符串,这是大多数ToString方法所做的。如果要从CHAR数组创建字符串,则需要使用相应的字符串构造函数。
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
我搜索了字符串构造函数,并使此更改为代码:

string boxtext = "";
使用(textreader Reader = file.opentext(@"C:\MyData.txt"))
{
char [] c = new char [36];
Reader.Readblock(C,0,36);
boxtext =新字符串(c);
}

this.textbox3.text = boxtext;

这给了我预期的结果。现在要创建一个指针,所以我可以读取下一个字段读取。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,587
地点
悉尼,澳大利亚
编程经验
10+
当您在StreamReader上调用读取方法时,它将文件指针推进到您读取的内容。您不必做任何事情来读取再次浏览ReadBlock的下一个字段。只有当您想要阅读新记录时,您需要通过在BaseStream上设置位置或呼叫寻求来移动该指针到所需记录的开头。
 

juggalobrotha

工作人员
加入
2011年4月23日
消息
177
地点
兰辛,MI;美国
编程经验
10+
我附上了mydata项目。我没有删除BIN和Object文件夹,以担心删除错误的事情。
我没有看到任何帖子的任何附件。
此外,它是删除垃圾箱的论坛规则&OBJ文件夹(其中一个规则是编译的文件,即EXE和/或DLL文件),其中所有这些两个文件夹都包含已编译的项目文件,其他一切是我们需要的源代码文件& VS creates the bin &首次运行obj文件夹。
如果您附上您的压缩项目,我可以今晚看看它。
 

juggalobrotha

工作人员
加入
2011年4月23日
消息
177
地点
兰辛,MI;美国
编程经验
10+
从调查它,虽然VB6允许程序读取/写入rand文件中的特定块,但是想法的想法有点不同,因为你想要将整个文件读入内存并将其解析为一个收集您制作匹配rand文件记录的结构的类。然后完成程序时,该程序需要该集合并将其全部写回文件。
如果您的程序是唯一一个使用此文件的程序,也许可能会在其中保留数据中的数据,而是可以读取该文件,然后将数据写入作为XML,这更容易与.NET一起使用,并且更兼容往前走。
 

Pumper.

成员
加入
2016年5月12日
消息
14
编程经验
1-3
mydata.zip.zip.zip.

我已附加了我的zip文件。

mydata.txt是一个缩短的数据文件,具有7条记录,没有其他文件使用该文件。
文件的第一个字段是存储的密码。然后每个记录都有3个字段,用于文本框。
我想读取密码并将其与输入的内容进行比较然后加载文本框。
我在我的程序中显示的只是读取密码并将其放入文本框中,这不是我想要的。

感谢您的帮助,我无法达到第一基地。
 

附件

  • mydata.zip.zip.zip.
    27.4 KB · Views: 31
最佳 底部