文本文件的读写操作
C语言
Python
Cpp
方法一:
- 头文件
fstream
、ifstream
、ofstream
fstresm
包含剩余两个文件、ifstream
文件写入操作、ofstream
文件读取操作
方法二:采用文件指针进行文本文件读写
- 建立文件指针:
FILE* fid = fopen("filepath","rb等读写操作");
- 判断文件是否被读入
if (fid==NULL){ cerr<<"Failed opening file."<<endl; exit(-1);}
- 开辟内存存放数据(以LAS数据结构体为例,使用
malloc
函数)
//建立结构体
struct LAS_DATA_A
{
double X;
double Y;
double Z;
int R;
int G;
int B;
double RH;
};
//主函数中开始分配内存
LAS_DATA_A *las_data_a = (LAS_DATA_A*)malloc(sizeof(LAS_DATA_A)*Row_NUM);
//结构体名 * 对象名 = (结构体名*)malloc(单个结构体大小*总体数量);
在完成内存分配之后,只需要将结构体数组指针当做数组使用即可,即las_data_a[1].X = ...
。
- 根据文件结构进行读写,以文本LAS数据为例
将数据存放于结构体之中,同时增加进度输出
注意!!!输出函数将会极大影响程序运行速度!在输出时应增加判断以减少输出
// 123(x) 234(y) 345(z) 110(R) 220 (G) 255(B) 0(RH) 分别以空格进行间隔
for (int i = 0; i < Row_NUM; i++)
{
fscanf(fid, "%lf %lf %lf %d %d %d %lf", &las_data_a[i].X, &las_data_a[i].Y, &las_data_a[i].Z, &las_data_a[i].R, &las_data_a[i].G, &las_data_a[i].B, &las_data_a[i].RH);
if (i % 100000 == 0)
printf("\b\b\b\b\b\b\b\b\b\b%3.5f%% ", (double)i * 100 / Row_NUM);
}
- 验证文件是否读完(采用fgetc()函数进行验证)
if(fgetc(fid)==EOF)
{
print("Read Finished\n"); //文本已经读到文本最后
}
C#
文件的读取
StreamReader
1. 使用前置命名空间using System.text
和using System.IO
2. 对象的建立:
方法一:
- 首先应创建FileStream对象
FileStream fs = new FileStream(@"c:\test.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
方法二:- 同SteamWriter一样,StreamReader类可以直接在包含具体文件路径的字符串中创建:
StreamReader sr = new StreamReader("test.txt");
3. 常用属性方法:
属性或方法 | 作用 |
---|---|
Encoding CurrentEncoding | 只读属性,获取当前流中使用的编码方式 |
bool EndOfStream | 只读属性,获取当前的流位置是否在流结尾 |
void Close() | 关闭流 |
int Peek() | 获取流中的下一个字符的整数,如果没有获取到字符, 则返回 -1 |
int Read() | 获取流中的下一个字符的整数 |
int Read(char[] buffer, int index, int count ) | 从指定的索引位置开始将来自当前流的指定的最多字符读到缓冲区 |
string ReadLine() | 从当前流中读取一行字符并将数据作为字符串返回 |
string ReadToEnd() | 读取来自流的当前位置到结尾的所有字符 |
举例:
class Program
{
static void Main(string[] args)
{
FileStream fs = new FileStream(@"c:\1.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);//用FileStream对象实例化一个StreamReader对象
while(sr.Peek()!=-1)//判断文件中是否有字符
{
string str = sr.ReadLine();//读取文件中的一行字符
Console.WriteLine(str);
}
sr.Close
}
}
分隔文件的读取
读取使用逗号分隔的文件,string类提供了一种称为
Split()
的方法,可以用于将字符串按照提供的分隔符分隔成字符组
String.Split方法提供的重载函数
名称 | 说明 |
---|---|
String.Split (Char[]) | 返回包含此实例中的子字符串(由指定 Char 数组的元素分隔)的 String 数组。 |
String.Split (Char[], Int32) | 返回包含此实例中的子字符串(由指定 Char 数组的元素分隔)的 String 数组。参数指定返回的子字符串的最大数量。 |
String.Split (Char[], StringSplitOptions) | 返回包含此字符串中的子字符串(由指定的Char 数组的元素分隔)的 String 数组。参数指定是否返回空数组元素。 |
String.Split (String[], StringSplitOptions) | 返回包含此字符串中的子字符串(由指定的String 数组的元素分隔)的 String 数组。参数指定是否返回空数组元素。 |
String.Split (Char[], Int32, StringSplitOptions) | 返回包含此字符串中的子字符串(由指定的 Char 数组的元素分隔)的 String 数组。参数指定要返回子字符串的最大数量,以及是否要返回空数组元素。 |
String.Split (String[], Int32, StringSplitOptions) | 返回包含此字符串中的子字符串(由指定的 String 数组的元素分隔)的 String 数组。参数指定要返回子字符串的最大数量,以及是否要返回空数组元素。 |
StringSplitOptions
是拆分的选项,StringSplitOptions.None
表示如果在拆分时遇到空字符也拆分出一个元素。StringSplitOptions.RemoveEmptyEntries
表示在拆分时不需要白喊空字符串。
例1:
###数据拆分使用举例,将一字符串以逗号为界线拆分为小字符串。
class Program
{
static void Main(string[] args)
{
string str = "100,20,30,40";
string[] condition = { "," };
string[] result = str.Split(condition, StringSplitOptions.None);
Console.WriteLine(result[0]);
Console.WriteLine(result[1]);
Console.WriteLine(result[2]);
Console.WriteLine(result[3]);
Console.WriteLine("数组的行数:"+result.Length);
Console.ReadLine();
}
}
结果:
数据格式转换的方法
C# Convert 方法是数据类型转换中最灵活的方法,它能够将任意数据类型的值转换成任意数据类型,前提是不要超出指定数据类型的范围。
方法 | 说明 |
---|---|
Convert.ToInt16() | 转换为整型(short) |
Convert.ToInt32() | 转换为整型(int) |
Convert.ToInt64() | 转换为整型(long) |
Convert.ToChar() | 转换为字符型(char) |
Convert.ToString() | 转换为字符串型(string) |
Convert.ToDateTime() | 转换为日期型(datetime) |
Convert.ToDouble() | 转换为双精度浮点型(double) |
Conert.ToSingle() | 转换为单精度浮点型(float) |