- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
全部,
我正在用 C++ 做一些编程练习,然后尝试将它们翻译成 C# 和其他语言以复习。
这个例子来自 Ch. 11.2 来自 Nell Dale 和 Chip Weems 的“使用 C++ 编程和解决问题”(第五版),第 521-522 页。这是一个接收此文件(学生姓名、GPA、四个成绩和类(class)成绩)的程序 - 我们称它为 rec.in
:
Mary Abbott 3.4 80 90 60 99 B
Bob Baker 4.0 90 90 90 95 A
Sally Carter 2.0 70 70 70 65 C
Bill Dansk 3.0 65 50 60 70 D
JoEllen Zureck 1.9 90 95 80 99 A
并且(或多或少)只是将其复制到另一个文件。
这是执行此操作的代码:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
const int MAX_STUDENTS = 150;
enum GradeType{A,B,C,D,F};
struct StudentRec
{
string stuName;
float gpa;
int examScore[4];
GradeType courseGrade;
};
StudentRec gradeBook[MAX_STUDENTS];
int main()
{
StudentRec record[MAX_STUDENTS];
ofstream outFile;
outFile.open("rec.out");
ifstream inFile;
inFile.open("rec.in");
for (int count = 0; count < MAX_STUDENTS; count++)
ReadValues(inFile, record[count]);
for (int count = 0; count <= MAX_STUDENTS; count++)
PrintValues(outFile, record[count]);
inFile.close();
outFile.close();
return 0;
}
void ReadValues(ifstream& inFile, StudentRec& record)
{
char letter;
char throwAway;
getline(inFile, record.stuName);
inFile >> record.gpa>>record.examScore[0]
>> record.examScore[1] >> record.examScore[2]
>> record.examScore[3] >> letter;
inFile.get(throwAway);
switch(letter)
{
case 'A' : record.courseGrade = A;
break;
case 'B' : record.courseGrade = B;
break;
case 'C' : record.courseGrade = C;
break;
case 'D' : record.courseGrade = D;
break;
case 'F' : record.courseGrade = F;
break;
}
}
void PrintValues(ofstream& outFile, StudentRec& record)
{
outFile << record.stuName << endl;
outFile << record.gpa << ' ' << record.examScore[0] << ' '
<< record.examScore[1] << ' '
<< record.examScore[2] << ' '
<< record.examScore[3] << ' ';
switch (record.courseGrade)
{
case A : outFile << 'A';
break;
case B : outFile << 'B';
break;
case C : outFile << 'C';
break;
case D : outFile << 'D';
break;
case F : outFile << 'F';
break;
}
outFile << endl;
}
我从翻译到 C# 开始。我以前做过 C# 工作,但没有做过控制台工作。结果,它有点……凌乱……工作翻译东西。我对在 C# 中匹配 C++ 的 getline
函数有点困惑。当然,还有 System.IO.StreamReader
,但它一次只能读取一个文件的一行。 getline
以流格式执行此操作,如上所示。这使用单词/字符之间的空格/换行符将其分解。我如何使用 C# 的库选择获得相同的结果?我并没有完全适应 System.IO.StreamReader
解决方案。
这是我的开始:
using System;
using System.IO;
namespace _112a
{
class Program
{
const int MAX_STUDENTS = 150;
enum GradeType{A,B,C,D,F};
struct StudentRec{
string stuName;
float gpa;
GradeType courseGrade;
};
StudentRec[] gradeBook = new StudentRec[MAX_STUDENTS];
static void Main(string[] args)
{
StudentRec[] record = new StudentRec[MAX_STUDENTS];
System.IO.StreamWriter outFile = new System.IO.StreamWriter("rec.out");
System.IO.StreamReader inFile = new System.IO.StreamReader("rec.in");
for (int count = 0; count < MAX_STUDENTS; count++)
{
ReadValues(inFile, record[count]);
}
for (int count = 0; count <= MAX_STUDENTS; count++)
{
PrintValues(outFile, record[count]);
}
inFile.Close();
outFile.Close();
}
static void ReadValues(StreamReader inFile, StudentRec record)
{
char letter;
char throwAway;
/*can't use getline, what do?*/
inFile.ReadLine();
switch (letter)
{
case 'A':
record.courseGrade = (GradeType)Enum.Parse(typeof(GradeType), "A");
break;
case 'B':
record.courseGrade = (GradeType)Enum.Parse(typeof(GradeType), "B");
break;
case 'C':
record.courseGrade = (GradeType)Enum.Parse(typeof(GradeType), "C");
break;
case 'D':
record.courseGrade = (GradeType)Enum.Parse(typeof(GradeType), "D");
break;
case 'F':
record.courseGrade = (GradeType)Enum.Parse(typeof(GradeType), "F");
break;
}
}
static void PrintValues(StreamWriter outFile, StudentRec record)
{
outFile.Write("{0}\n{1} {2} {3} ", record.stuName, record.examScore[0], record.examScore[1], record.examScore[2], record.examScore[3]);
switch(record.courseGrade)
{
case GradeType.A:
outFile.Write("A\n");
break;
case GradeType.B:
outFile.Write("B\n");
break;
case GradeType.C:
outFile.Write("C\n");
break;
case GradeType.D:
outFile.Write("D\n");
break;
case GradeType.F:
outFile.Write("F\n");
}
}
}
}
关于您在方法 PrintValues
中看到的开关结构,我有一个额外的问题:在每种情况下,C++ 文件中指定它只采用 record.courseGrade
字段并将其与 case
后面指定的参数进行比较。 C# 作为一种强类型语言,不会让这种情况发生...如果您将 char
'A' 与 record.courseGrade
进行比较,则会出现类型不匹配错误.或者,不使用单引号将其保留(并因此将其保留为 record.courseGrade
字段)会给出错误 The name 'A' does not exist in the current context.
我该如何最好地处理这个问题?- 已解决
我对 ReadLine() 使用的困惑源于它的工作方式。在这种情况下,您有多个正在填充的 StudentRec
结构成员,但它们是结构中的独立实体。我担心会做类似的事情:
StudentRec.stuName = inFile.ReadLine();
并用 StudentRec.stuName
填充整行,其他结构字段中没有任何内容。
此外,我们还遇到了 letter
未分配并用作开关的问题;这是因为它从未从 ReadLine
接收到值。然而,这是一个学术解决方案,如果 ReadLine
确实将事情分开的话。
最佳答案
您想分别使用 StreamReader 和 Writer。您可能正在寻找的方法是 ReadLine
和 WriteLine
,StreamReader 文档底部有一个可满足您需求的工作示例。您只需要更改 while 循环内的文件路径和逻辑。文档可以在这里找到;
http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx
StreamWriter 文档在此处,底部有一个同时使用读取器和写入器的示例;
http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx
所有方法都具有逻辑名称,并且比对应的 C++ 方法更易于实现。
我认为您的开关会导致编译错误,因为 case 需要是 case "A":
而不是 case A:
。如果你在那里放一个文字,它会进行字符串比较。它不理解 A 是什么,除非它是局部变量的名称。
编辑:读取文件的示例代码;
// we need to alloc/init the streams inside for using blocks so they're properly disposed of
List<string> grades = new List<string>();
using (StreamReader inFile = new StreamReader("rec.in"))
{
string line;
while ((line = inFile.ReadLine()) != null)
{
string[] tokens = line.Split(' '); // split line on whitespace
if (tokens.Length > 7)
grades.Add(tokens[7]);
}
}
using (StreamWriter outFile = new StreamWriter("rec.out"))
{
foreach (string s in grades)
outFile.WriteLine(s);
}
我在上面使用的技术并非完全必要,例如,您可以将 StreamWriter using 嵌套在 StreamReader 中,并在同一范围内进行写入。在 C# 版本中,您逐行遍历文件的内容。每次我们得到一条线时,我们都想在空格上拆分它以获得它的子组件。然后我将字母等级添加到列表中。我们不希望在输出字符串中出现换行符,因为 WriteLine
会自动执行此操作。读取文件后,我们遍历列表中的每个字符串并将其写入输出文件。
关于c# - 将 C++ 文件读取/写入转换为 C# 文件读取/写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16802871/
我有这个代码 var myChart = new FusionCharts("../themes/clean/charts/hbullet.swf", "myChartId", "400", "75
既然写入是立即进行的(复制到内核缓冲区并返回),那么使用 io_submit 进行写入有什么好处? 事实上,它 (aio/io_submit) 看起来更糟,因为您必须在堆上分配写入缓冲区并且不能使用基
我正在使用 mootool 的 Request.JSON 从 Twitter 检索推文。收到它后,我将写入目标 div 的 .innerHTML 属性。当我在本地将其作为文件进行测试时,即 file:
最终,我想将 Vertica DB 中的数据抓取到 Spark 中,训练机器学习模型,进行预测,并将这些预测存储到另一个 Vertica DB 中。 当前的问题是确定流程最后部分的瓶颈:将 Spark
我使用 WEKA 库编写了一个 Java 程序, 训练分类算法 使用经过训练的算法对未标记的数据集运行预测 将结果写入 .csv 文件 问题在于它当前写出离散分类结果(即算法猜测一行属于哪个类别)。我
背景 - 我正在考虑使用 clickonce 通过 clickonce(通过网站)部署 WinForms 应用程序。相对简单的应用程序的要素是: - 它是一个可执行文件和一个数据库文件(sqlite)
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
我正在读取 JSON 文件,取出值并进行一些更改。 基本上我向数组添加了一些值。之后我想将其写回到文件中。当我将 JSONArray 写回文件时,会被写入字符串而不是 JSONArray 对象。怎样才
我为两个应用程序使用嵌入式数据库,其中一个是服务器,另一个是客户端。客户端应用程序。可以向服务器端发送获取数据请求以检索数据并显示在表格(或其他)中。问题是这样的:如何将获取的数据保存(写入)到页面文
是否有更好的解决方案来快速初始化 C 数组(在堆上创建)?就像我们使用大括号一样 double** matrix_multiply(const double **l_matrix, const dou
从问题得出问题:找到所有 result = new ArrayList(); for (int i = 2; i >(i%8) & 0x1) == 0) { result.add(i
由于某种原因,它没有写入 CSV。谁能明白为什么它不写吗? def main(): list_of_emails = read_email_csv() #read input file, cr
关闭。 这个问题是 not reproducible or was caused by typos 。它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能在这里出现,
我目前正在开发一个保存和加载程序,但我无法获得正确的结果。 编写程序: #include #include #define FILENAME "Save" #define COUNT 6 type
import java.io.*; public class Main2 { public static void main(String[] args) throws Exception {
我需要使用预定义位置字符串“Office”从所有日历中检索所有 iOS 事件,然后将结果写入 NSLog 和 UITextView。 到目前为止,这是我的代码: #import "ViewCo
我正在尝试将 BOOL 值写入 PFInstallation 中的列,但会不停地崩溃: - (IBAction)pushSwitch:(id)sender { NSUserDefaults *push
我以前在学校学过一些简单的数据库编程,但现在我正在尝试学习最佳实践,因为我正在编写更复杂的应用程序。写入 MySQL 数据库并不难,但我想知道让分布式应用程序写入 Amazon EC2 上的远程数据库
是否可以写回到ResourceBundle?目前我正在使用 ResourceBundle 来存储信息,在运行时使用以下内容读取信息 while(ResourceBundle.getBundle("bu
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!