Linux中國

不同的編程語言是如何讀寫數據的

在 Jim Hall 的《不同的編程語言如何完成相同的事情》文章中,他演示了 13 種不同的語言如何使用不同的語法來完成同一個任務。經驗是,編程語言往往有很多相似之處。一旦你了解了一種編程語言,你就可以通過理解它的語法和結構來學習另一種。

本著同樣的精神,Jim 的文章比較了不同編程語言如何讀寫數據。無論數據來自配置文件還是用戶創建的文件,在存儲設備上處理數據都是程序員的常見任務。以這種方式涵蓋所有編程語言是不切實際的,但最近的 Opensource.com 系列文章提供了對這些編程語言採用的不同方法的深入了解:

讀寫數據

用計算機讀寫數據的過程和你在現實生活中讀寫數據的過程類似。要訪問書中的數據,你首先要打開它,然後閱讀單詞或將生詞寫入書中,然後合上書。

當程序需要從文件中讀取數據時,你向程序傳入一個文件位置,然後計算機將該數據讀入內存中並解析它。同樣,當程序需要將數據寫入文件時,計算機會將新數據放入系統的內存寫入緩衝區,然後將其同步到存儲設備上的文件中。

下面是這些操作的一些偽代碼:

  1. 在內存中載入文件。
  2. 讀取文件內容,或將數據寫入文件。
  3. 關閉文件。

從文件中讀取數據

Opensource.com 系列文章的語言中,你可以看到讀取文件的三種趨勢。

C

在 C 語言中,打開文件可能涉及檢索單個字元(直到 EOF 指示符,表示文件結束)或一個數據塊,具體取決於你的需求和方法。根據你的目標,它可能感覺像一個主要是手工的過程,但這正是其他語言所模仿的。

FILE *infile;
int ch;

infile = fopen(argv[1], "r");

do {
  ch = fgetc(infile);
  if (ch != EOF) {
    printf("%c", ch);
  }
 } while (ch != EOF);

fclose(infile);

你還可以選擇將文件的某些部分載入到系統緩衝區中,然後在緩衝區外工作。

FILE *infile;
char buffer[300];

infile = fopen(argv[1], "r");

while (!feof(infile)) {
  size_t buffer_length;
  buffer_length = fread(buffer, sizeof(char), 300, infile);
}

printf("%s", buffer);
fclose(infile);

C++

C++ 簡化了一些步驟,允許你將數據解析為字元串。

std::string sFilename = "example.txt";

std::ifstream fileSource(sFilename);
std::string buffer;

while (fileSource >> buffer) {
  std::cout << buffer << std::endl;
}

Java

Java 和 Groovy 類似於 C++。它們使用名為 Scanner 的類來設置數據流或對象,這樣就會包含你選擇的文件內容。你可以通過標記(位元組、行、整數等)掃描文件。

File myFile = new File("example.txt");

Scanner myScanner = new Scanner(myFile);
  while (myScanner.hasNextLine()) {
    String line = myScanner.nextLine();
    System.out.println(line);
  }

myScanner.close();

Groovy

def myFile = new File(&apos;example.txt&apos;)

def myScanner = new Scanner(myFile)
  while (myScanner.hasNextLine()) {
    def line = myScanner.nextLine()
    println(line)
  }

myScanner.close()

Lua

Lua 和 Python 進一步抽象了整個過程。你不必有意識地創建數據流,你只需給一個變數賦值為 open 函數的返回值,然後解析該變數的內容。這種方式快速,最簡且容易。

myFile = io.open(&apos;example.txt&apos;, &apos;r&apos;)

lines = myFile:read("*all")
print(lines)

myFile:close()

Python

f = open(&apos;example.tmp&apos;, &apos;r&apos;)

for line in f:
    print(line)

f.close()

向文件中寫入數據

就寫代碼來說,寫入是讀取的逆過程。因此,將數據寫入文件的過程與從文件中讀取數據基本相同,只是使用了不同的函數。

C

在 C 語言中,你可以使用 fputc 函數將字元寫入文件:

fputc(ch, outfile);

或者,你可以使用 fwrite 將數據寫入緩衝區。

fwrite(buffer, sizeof(char), buffer_length, outfile);

C++

因為 C++ 使用 ifstream 庫為數據打開緩衝區,所以你可以像 C 語言那樣將數據寫入緩衝區(C++ 庫除外)。

std::cout << buffer << std::endl;

Java

在 Java 中,你可以使用 FileWriter 類來創建一個可以寫入數據的對象。它的工作方式與 Scanner 類非常相似,只是方向相反。

FileWriter myFileWriter = new FileWriter("example.txt", true);
myFileWriter.write("Hello worldn");
myFileWriter.close();

Groovy

類似地,Groovy 使用 FileWriter,但使用了稍微 「groovy」 的語法。

new FileWriter("example.txt", true).with {
  write("Hello worldn")
  flush()
}

Lua

Lua 和 Python 很相似,都使用名為 open 的函數來載入文件,writer 函數來寫入數據,close 函數用於關閉文件。

myFile = io.open(&apos;example.txt&apos;, &apos;a&apos;)
io.output(myFile)
io.write("hello worldn")
io.close(myFile)

Python

myFile = open(&apos;example.txt&apos;, &apos;w&apos;)
myFile.write(&apos;hello world&apos;)
myFile.close()

File 模式

許多語言在打開文件時會指定一個「模式」。模式有很多,但這是常見的定義:

  • w 表示寫入
  • r 表示讀取
  • r+ 表示可讀可寫
  • a 表示追加

某些語言,例如 Java 和 Groovy,允許你根據用於載入文件的類來確定模式。

無論編程語言以何種方式來確定文件模式,你都需要確保你是在 追加 數據,除非你打算用新數據覆蓋文件。編程語言不像文件選擇器那樣,沒有內置的提示來警告你防止數據丟失。

新語言和舊把戲

每種編程語言都有其獨特完成任務的方式,這就是為什麼有這麼多語言可供選擇。你可以而且應該選擇最合適你的語言。但是,你一旦了解了編程的基本結構,你可以隨意嘗試其他語言,而不必擔心不知道如何完成基本任務。通常情況下,實現目標的途徑是相似的,所以只要你牢記基本概念,它們就很容易學習。

via: https://opensource.com/article/21/7/programming-read-write

作者:Alan Smithee 選題:lujun9972 譯者:MjSeven 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國