c#的几个问题:程序不从我的数组中读取文件,在line.split中遇到麻烦
本文关键字:文件 读取 line 麻烦 遇到 split 数组 几个问题 程序 我的 | 更新日期: 2023-09-27 18:09:08
所以我有麻烦的程序识别我的数组元素的值(名称'a'不存在于当前上下文中),加上我不能得到行。split要工作(我需要它读取','之后的下一个元素,它需要循环所有的书(这是一个图书馆程序)。最后,我不知道如何在for循环中更改"10"(我将数字随机放置,因此它不会显示错误),以便程序在读取.txt中的所有信息后停止。代码如下:编辑:它没有显示任何更多的错误,它只是崩溃了。(
using System;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
foreach (string line in File.ReadAllLines(@"Duomenys.txt"))
{
string[] a = line.Split(',');
int ISBN = int.Parse(a[0]);
string BookName = a[1];
string Author = a[2];
string Genre = a[3];
string Publisher = a[4];
int PublishYear = int.Parse(a[5]);
int PageNumber = int.Parse(a[6]);
Console.WriteLine(PublishYear);
Console.WriteLine();
Console.ReadKey();
}
}
public void BookWithTheMostPages(int[] a)
{
int maxPages = 0;
string[] lines = File.ReadAllText(@"Duomenys.txt").Split(''n');
foreach (string line in lines)
{
{
Console.ReadLine();
if (a[6] > maxPages)
{
maxPages = a[6];
Console.WriteLine("Storiausios knygos pavadinimas: {0} , jos autorius(-ė): {1}", a[1], a[2]);
}
}
}
}
public void Publish(string[] a)
{
if (!File.Exists(@"Technologija.csv"))
File.Create(@"Technologija.csv").Dispose();
using (StreamWriter streamwrite = new StreamWriter(File.OpenWrite(@"Technologija.csv")))
{
if (a[2] == "Technologija")
{
streamwrite.WriteLine("'n ISBN : {0}, Pavadinimas: {1}, Autorius: {2}, Tipas: {3}, Leidykla: {4}, Išleidimo Metai: {5}, Puslapių skaičius: {6}", a[0], a[1], a[2], a[3], a[4], a[5], a[6]);
}
}
}
public void Output(string[] a)
{
if (!File.Exists(@"Autoriai.csv"))
File.Create(@"Autoriai.csv").Dispose();
using (StreamWriter streamWriter = new StreamWriter(File.OpenWrite(@"Autoriai.csv")))
{
streamWriter.WriteLine("'n{0}", a[2]);
}
}
public void Publishyear(string[] a)
{
if (a[5] == "2014")
{
for (int j = 1; j <= 5; j++)
Console.WriteLine("'nKnygos ISBN: {0}, Pavadinimas {1}, Autorius {2}", a[0], a[1], a[2]);
}
}
}
}
下面是。txt的例子:
9781408855669,《哈利波特与密室》,乔安妮·K·罗琳,Apysaka, Bloomsbury Publishing PLC, 1998,270。(一行)
a
和line
的作用域为静态Main
方法(实际上a
在Main
中定义了两次,这是不合法的)。它们在此之外不存在,除非您通过将它们作为参数传递或通过字段使它们可用来使它们可用。你应该:
- 想出更有意义的名字;
a
不会帮你 - 将值作为参数传入(在我看来这将比字段更干净,但字段也可以工作)
- 决定你是否在实例或
static
上下文中工作-目前你都有,但从未实例化对象,所以你将无法调用任何方法
注意using
和foreach
不应该以结尾;你的意思可能是:
foreach (string line in File.ReadAllLines(@"Duomenys.txt"))
{
string[] a = line.Split(',');
...
}
(不需要using
/StreamReader
)
'a'只存在于main函数中。就像Marc说的,如果你在不同的函数中使用'a',你会想要将'a'作为参数传入。
函数的第一行:
public void BookWithTheMostPages() {
}
应:public void BookWithTheMostPages(string[] a)
应该在main函数中像这样调用:
BookeWithTheMostPages(a);
这样函数"知道"a是什么。
另外,我注意到您没有告诉Main函数运行您编写的任何函数。该程序运行Main函数中的所有内容,而不仅仅是Main.cs文件中的所有内容。所以你的'Publishyear', 'Output', 'Publish'和'BookWithTheMostPages'函数根本没有运行。
现在关于你的分裂功能不工作这里有2件事:
- 在你的程序中已经有了一个名为"a"的变量,你不能用相同的名字命名另一个变量。有意义吗?
- 你必须'Split'到另一个数组,因为Split返回一系列字符串
应该是这样的
string[] splitLine = line.split(',');
这两行也不正确:
int PublishYear = Convert.ToInt32(a[5]);
int PageNumber = Convert.ToInt32(a[6]);
如果你想让'PublishYear'和'PageNumber'函数返回int,它们不能是void函数。
public int Publishyear() {
/*Write your code in here*/
return year;
}
然后你可以像这样使用函数来获取一个值
int i = Publishyear();
同样适用于你的'PageNumber'函数。
程序中还有很多我没有提到的小错误,要把每个错误都写下来并给出解释可能要花很长时间,但是对于像你这样的初学者来说,可以一点一点地理解。遵循如下准则:
- 在纸上写下程序应该做什么。
- 编写一小部分代码(几行)
- 测试它。
- 重复步骤2和3直到完成。
最后一件事,养成使用更具描述性的名称来命名变量的习惯。"a"不会让读者一眼就知道"a"是什么。编写易于其他人阅读的代码。我知道一开始编程可能看起来非常困难和令人困惑,但坚持下去,不要放弃。渐渐地,你会弄明白整个编程的事情。
干杯!
首先,删除
using (StreamReader dn = new StreamReader(@"Duomenys.txt"));
如果您不使用它。如果您正在使用File.ReadAllLines
读取文件,则不需要它。此外,您没有正确使用foreach循环。你想要走的路应该是这样的:
foreach (string line in File.ReadAllLines(@"Duomenys.txt"))
{
string[] a = line.split(',');
int ISBN = Convert.ToInt32(a[0]);
string BookName = a[1];
string Author = a[2];
string Genre = a[3];
string Publisher = a[4];
int PublishYear = Convert.ToInt32(a[5]);
int PageNumber = Convert.ToInt32(a[6]);
}
我修复的是,你首先创建一个名为a的字符串数组,但随后创建一个名为a的正常字符串,这不起作用。也不需要设置数组的大小,string.Split()
会自动完成。
编辑:要循环文件行,假设它们被行终止符分隔,您可以这样做:
string[] lines = File.ReadAllText(filename).Split(''n');
// ''n' as the regular line terminator
foreach (string line in lines)
{
// Your other code ...