導航:首頁 > 編程知識 > 按位元組編程怎麼用

按位元組編程怎麼用

發布時間:2023-05-22 22:48:19

1. C++的問題,怎樣按位元組讀取二進制文件

這個功能完全可以用 C 語言實現,你干嗎非要用 C++ 呢? 語言實現就足夠了。
不要為了 C++ 而寫 C++ 程序,這樣寫出來的源程序,可讀性較差。只有當問題本身確實適合用 C ++ 來描述時,再用 C ++ 寫程序,這樣才自然。而且了,在 C ++ 程序中,寫 C 語言的函數也完全沒有問題,至少這個功能你可以用 C 代碼寫。

如果你需要對文本文件進行讀、寫操作,用:"r" 、"w" 方式,
如果你需要對二進制文件進行讀、寫操作,用:"rb" 、"wb" 方式。

如果你確保每一條記錄的位元組數都完全相同,你可以使用:fread()、fwrite() 庫函數實現你的功能。

#include <stdio.h>
void main()
{
FILE * fpr ; * fpw;
unsigned char record[60] ; /* 假設每一條記錄是 60 個位元組 */

if( ( fpr=fopen("source", "rb") ) == NULL )
{
printf("Can't open source file for read\n") ;
exit(1);
}

if( ( fpw = fopen("target", "wb") ) == NULL )
{
printf("Can't open target file for write!\n") ;
exit(1);
}

fread( record, sizeof(record), 1, fpr ) ; /* 讀一條記錄 */

......
fwrite( record, sizeof(record), 1, fpw ) ; /* 寫一條記錄 */

fclose(fpr) ; fclose(fpw) ;
}

2. 利用位元組文件輸入輸出流,編寫程序完成文件的讀,寫,復制功能。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;

/**
* 多種方式讀文件內容。 按位元組讀取文件內容、按字元讀取文件內容、按行讀取文件內容、隨機讀取文件內容
*/
public class ReadFromFile
{
public static void main(String[] args)
{
String fileName = "C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}

/**
* 以位元組為單位讀取文件,常用於讀二進制文件,如圖片、聲音、影像等文件。
*
* @param fileName
* 文件的名
*/
public static void readFileByBytes(String fileName)
{
File file = new File(fileName);
InputStream in = null;
try
{
System.out.println("以位元組為單位讀取文件內容,一次讀一個位元組:");
// 一次讀一個位元組
in = new FileInputStream(file);
int tempbyte;
while ((tempbyte = in.read()) != -1)
{
System.out.write(tempbyte);
}
in.close();
}
catch (IOException e)
{
e.printStackTrace();
return;
}
try
{
System.out.println("以位元組為單位讀取文件內容,一次讀多個位元組:");
// 一次讀多個位元組
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
// 讀入多個位元組到位元組數組中,byteread為一次讀入的位元組數
while ((byteread = in.read(tempbytes)) != -1)
{
System.out.write(tempbytes, 0, byteread);
}
}
catch (Exception e1)
{
e1.printStackTrace();
}
finally
{
if (in != null)
{
try
{
in.close();
}
catch (IOException e1)
{
}
}
}
}

/**
* 以字元為單位讀取文件,常用於讀文本,數字等類型的文件
*
* @param fileName
* 文件名
*/
public static void readFileByChars(String fileName)
{
File file = new File(fileName);
Reader reader = null;
try
{
System.out.println("以字元為單位讀取文件內容,一次讀一個位元組:");
// 一次讀一個字元
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1)
{
// 對於windows下,\r\n這兩個字元在一起時,表示一個換行。
// 但如果這兩個字元分開顯示時,會換兩次行。
// 因此,屏蔽掉\r,或者屏蔽\n。否則,將會多出很多空行。
if (((char) tempchar) != '\r')
{
System.out.print((char) tempchar);
}
}
reader.close();
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
System.out.println("以字元為單位讀取文件內容,一次讀多個位元組:");
// 一次讀多個字元
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
// 讀入多個字元到字元數組中,charread為一次讀取字元數
while ((charread = reader.read(tempchars)) != -1)
{
// 同樣屏蔽掉\r不顯示
if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != '\r'))
{
System.out.print(tempchars);
}
else
{
for (int i = 0; i < charread; i++)
{
if (tempchars[i] == '\r')
{
continue;
}
else
{
System.out.print(tempchars[i]);
}
}
}
}

}
catch (Exception e1)
{
e1.printStackTrace();
}
finally
{
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e1)
{
}
}
}
}

/**
* 以行為單位讀取文件,常用於讀面向行的格式化文件
*
* @param fileName
* 文件名
*/
public static void readFileByLines(String fileName)
{
File file = new File(fileName);
BufferedReader reader = null;
try
{
System.out.println("以行為單位讀取文件內容,一次讀一整行:");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
// 一次讀入一行,直到讀入null為文件結束
while ((tempString = reader.readLine()) != null)
{
// 顯示行號
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e1)
{
}
}
}
}

/**
* 隨機讀取文件內容
*
* @param fileName
* 文件名
*/
public static void readFileByRandomAccess(String fileName)
{
RandomAccessFile randomFile = null;
try
{
System.out.println("隨機讀取一段文件內容:");
// 打開一個隨機訪問文件流,按只讀方式
randomFile = new RandomAccessFile(fileName, "r");
// 文件長度,位元組數
long fileLength = randomFile.length();
// 讀文件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
// 將讀文件的開始位置移到beginIndex位置。
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
// 一次讀10個位元組,如果文件內容不足10個位元組,則讀剩下的位元組。
// 將一次讀取的位元組數賦給byteread
while ((byteread = randomFile.read(bytes)) != -1)
{
System.out.write(bytes, 0, byteread);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (randomFile != null)
{
try
{
randomFile.close();
}
catch (IOException e1)
{
}
}
}
}

/**
* 顯示輸入流中還剩的位元組數
*
* @param in
*/
private static void showAvailableBytes(InputStream in)
{
try
{
System.out.println("當前位元組輸入流中的位元組數為:" + in.available());
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

/////////////////////////////////////////////////////////////////

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFileUtil
{

/**
* 復制整個目錄的內容,如果目標目錄存在,則不覆蓋
*
* @param srcDirName
* 待復制的目錄名
* @param destDirName
* 目標目錄名
* @return 如果復製成功返回true,否則返回false
*/
public static boolean Directory(String srcDirName, String destDirName)
{
return CopyFileUtil.Directory(srcDirName, destDirName, false);
}

/**
* 復制整個目錄的內容
*
* @param srcDirName
* 待復制的目錄名
* @param destDirName
* 目標目錄名
* @param overlay
* 如果目標目錄存在,是否覆蓋
* @return 如果復製成功返回true,否則返回false
*/
public static boolean Directory(String srcDirName, String destDirName, boolean overlay)
{
// 判斷原目錄是否存在
File srcDir = new File(srcDirName);
if (!srcDir.exists())
{
System.out.println("復制目錄失敗:原目錄" + srcDirName + "不存在!");
return false;
}
else if (!srcDir.isDirectory())
{
System.out.println("復制目錄失敗:" + srcDirName + "不是一個目錄!");
return false;
}
// 如果目標文件夾名不以文件分隔符結尾,自動添加文件分隔符
if (!destDirName.endsWith(File.separator))
{
destDirName = destDirName + File.separator;
}
File destDir = new File(destDirName);
// 如果目標文件夾存在,
if (destDir.exists())
{
if (overlay)
{
// 允許覆蓋則刪除已存在的目標目錄
System.out.println("目標目錄已存在,准備刪除它!");
if (!DeleteFileUtil.delete(destDirName))
{
System.out.println("復制目錄失敗:刪除目標目錄" + destDirName + "失敗!");
}
}
else
{
System.out.println("復制目錄失敗:目標目錄" + destDirName + "已存在!");
return false;
}
}
else
{
// 創建目標目錄
System.out.println("目標目錄不存在,准備創建它!");
if (!destDir.mkdirs())
{
System.out.println("復制目錄失敗:創建目標目錄失敗!");
return false;
}
}
boolean flag = true;
// 列出源文件夾下所有文件(包括子目錄)的文件名
File[] files = srcDir.listFiles();
for (int i = 0; i < files.length; i++)
{
// 如果是一個單個文件,則進行復制
if (files[i].isFile())
{
flag = CopyFileUtil.File(files[i].getAbsolutePath(), destDirName + files[i].getName());
if (!flag)
{
break;
}
}
// 如果是子目錄,繼續復制目錄
if (files[i].isDirectory())
{
flag = CopyFileUtil.Directory(files[i].getAbsolutePath(), destDirName + files[i].getName());
if (!flag)
{
break;
}
}
}
if (!flag)
{
System.out.println("復制目錄" + srcDirName + "至" + destDirName + "失敗!");
return false;
}
System.out.println("復制目錄" + srcDirName + "至" + destDirName + "成功!");
return true;

}

/**
* 復制單個文件, 如果目標文件存在,則不覆蓋。
*
* @param srcFileName
* 待復制的文件名
* @param destFileName
* 目標文件名
* @return 如果復製成功,則返回true,否則返回false
*/
public static boolean File(String srcFileName, String destFileName)
{
return CopyFileUtil.File(srcFileName, destFileName, false);
}

/**
* 復制單個文件
*
* @param srcFileName
* 待復制的文件名
* @param destFileName
* 目標文件名
* @param overlay
* 如果目標文件存在,是否覆蓋
* @return 如果復製成功,則返回true,否則返回false
*/
public static boolean File(String srcFileName, String destFileName, boolean overlay)
{
// 判斷原文件是否存在
File srcFile = new File(srcFileName);
if (!srcFile.exists())
{
System.out.println("復制文件失敗:原文件" + srcFileName + "不存在!");
return false;
}
else if (!srcFile.isFile())
{
System.out.println("復制文件失敗:" + srcFileName + "不是一個文件!");
return false;
}
// 判斷目標文件是否存在
File destFile = new File(destFileName);
if (destFile.exists())
{
// 如果目標文件存在,而且復制時允許覆蓋。
if (overlay)
{
// 刪除已存在的目標文件,無論目標文件是目錄還是單個文件
System.out.println("目標文件已存在,准備刪除它!");
if (!DeleteFileUtil.delete(destFileName))
{
System.out.println("復制文件失敗:刪除目標文件" + destFileName + "失敗!");
return false;
}
}
else
{
System.out.println("復制文件失敗:目標文件" + destFileName + "已存在!");
return false;
}
}
else
{
if (!destFile.getParentFile().exists())
{
// 如果目標文件所在的目錄不存在,則創建目錄
System.out.println("目標文件所在的目錄不存在,准備創建它!");
if (!destFile.getParentFile().mkdirs())
{
System.out.println("復制文件失敗:創建目標文件所在的目錄失敗!");
return false;
}
}
}
// 准備復制文件
int byteread = 0;// 讀取的位數
InputStream in = null;
OutputStream out = null;
try
{
// 打開原文件
in = new FileInputStream(srcFile);
// 打開連接到目標文件的輸出流
out = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
// 一次讀取1024個位元組,當byteread為-1時表示文件已經讀完
while ((byteread = in.read(buffer)) != -1)
{
// 將讀取的位元組寫入輸出流
out.write(buffer, 0, byteread);
}
System.out.println("復制單個文件" + srcFileName + "至" + destFileName + "成功!");
return true;
}
catch (Exception e)
{
System.out.println("復制文件失敗:" + e.getMessage());
return false;
}
finally
{
// 關閉輸入輸出流,注意先關閉輸出流,再關閉輸入流
if (out != null)
{
try
{
out.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (in != null)
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}

public static void main(String[] args)
{
// 復制單個文件,如果目標存在,則覆蓋
String srcPath = "C:/temp/tempfile0.txt";
String destPath = "C:/temp_bak/tempfile0_bak.txt";
CopyFileUtil.File(srcPath, destPath, true);
// 如果目標存在,則不覆蓋
CopyFileUtil.File(srcPath, destPath);
System.out.println();
// 復制文件夾,如果目標存在,則覆蓋
String srcDir = "C:/temp";
String destDir = "D:/temp";
CopyFileUtil.Directory(srcDir, destDir, true);
}
}

3. PLC中位元組 字 雙字的用法

題目太大了。常規是:
1、位元組:比較,判斷、循環計數、從字或雙字取出自己需要的位元組來專門某個目的使用等等;2、字:正數運算、比較判斷,數據輸出、顯示等等;
3、雙字:浮點數運算等等。
PLC中位元組 字 雙字的用法,程序設計手冊都有介紹。關鍵需要編程實踐中自己領悟,不能一概而論,有的資料個別有錯,需要位元組動手編程驗證,變成自己的真實理解和應用規則。聽一萬遍不如自己動手做一遍!!!

4. 簡述什麼叫做位元組對齊,編程時使用什麼方式在代碼中說

什麼是位元組對齊:

位元組(Byte)是計算機信息技術用於計量存儲容量和傳輸容量的一種計量單位,一個位元組等於8位二進制數,在UTF-8編碼中,一個英文字元等於一個位元組。

位元組按照一定規則在空間上排列就是位元組對齊。

解釋

現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定類型變數的時候經常在特 定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

作用和原因:

各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下編程必須保證位元組對齊。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 數據存放進行對齊,會在存取效率上帶來損失。

比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為32位系統)如果存放在偶地址開始的地方,那麼一個讀周期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀周期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數據。

准則:

其實位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足三個准則:

1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;

2) 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的地址空間。

3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組。

概念與規則:

四個基本概念

1.數據類型自身的對齊值:對於char型數據,其自身對齊值為1,對於short型為2,對於int,float類型,其自身對齊值為4,對於double型,其自身對齊值為8,單位位元組。

2.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

3.指定對齊值:#pragma pack (value)時的指定對齊值value。

4.數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。對齊規則有效對齊值N是最終用來決定數據存放地址方式的值,最重要。有效對齊N,就是表示「對齊在N上」,也就是說該數據的"存放起始地址%N=0".而數據結構中的數據變數都是按定義的先後順序來排放的。第一個數據變數的起始地址就是數據結構的起始地址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整。

5. 小弟初學PLC編程時,什麼時候該用位元組,什麼時候該用字,什麼時候該用雙字

位元組只能表示0-255的數字。字可以表示0-65535,雙字可以表示n多億。如果你的數值不大或者需要按位定址那麼位元組就行。如果數值較大用字。數值很大或浮點數那得用雙字了。

閱讀全文

與按位元組編程怎麼用相關的資料

熱點內容
少兒編程和無人機編程哪個好 瀏覽:383
ensp配置文件怎麼導出 瀏覽:939
52好壓右鍵沒有壓縮文件選項 瀏覽:98
avi什麼類型的文件格式 瀏覽:418
分區表與文件系統 瀏覽:786
獲得文件夾路徑的對話框 瀏覽:179
弟子規哪個版本的好 瀏覽:423
二手蘋果6p的價格 瀏覽:111
微信公眾號版頭設計 瀏覽:917
jdk18讀取配置文件 瀏覽:72
優化關鍵字挖掘工具 瀏覽:672
markdown代碼塊語法 瀏覽:249
arcgis面文件屬性 瀏覽:43
當數據都帶有標准差如何計算 瀏覽:936
聲音挑選程序掃描本地 瀏覽:57
編程語言中如何拼接兩個字串符 瀏覽:482
工地數據中心包括哪些 瀏覽:972
人工成本分析工具 瀏覽:565
蘋果qq群文件在哪裡 瀏覽:724
產品和單位成本分析後有哪些數據 瀏覽:144

友情鏈接