簡體   English   中英

C 使用 fread 讀取未知數量的數據

[英]C using fread to read an unknown amount of data

我有一個名為 test.txt 的文本文件

里面會有一個數字,它可能是以下任何一個:

1
2391
32131231
3123121412

即它可以是任何大小的數字,從 1 位數字到 x 位數字。 該文件中只有 1 個東西——這個數字。

我想要一些使用fread()的代碼,它將從文件中讀取該字節數並將其放入適當大小的變量中。 這是在嵌入式設備上運行; 我關心 memory 的使用情況。

如何解決這個問題呢?

你可以簡單地使用:

char buffer[4096];
size_t nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp);

if (nbytes == 0)
    ...EOF or other error...
else
    ...process nbytes of data...

或者,換句話說,為自己提供足夠大的數據空間以存儲任何有效數據,然后記錄實際讀取到字符串中的數據量。 請注意,除非bufferfread()之前包含全部為零或文件包含零字節,否則該字符串不會以空值終止。 在使用之前,您不能依賴局部變量歸零。

目前尚不清楚如何創建“適當大小的變量”。 您可能最終使用動態內存分配( malloc() )來提供正確的空間量,然后從函數返回分配的指針。 請記住在使用之前檢查空值返回(內存不足)。

實現此目的的一種方法是使用fseek將文件流位置移動到文件末尾:

fseek(file, SEEK_END, SEEK_SET);

然后使用ftell獲取文件中光標的位置 - 這將返回以字節為單位的位置,這樣您就可以使用此值來分配適當大的緩沖區,然后將文件讀入該緩沖區。

我已經看到警告說這可能並不總是100%准確但我在幾個實例中使用它沒有問題 - 我認為問題可能取決於某些平台上的功能的特定實現。

如果你想避免過度閱讀, fread不是正確的功能。 您可能希望fscanf具有%100[0123456789]行的轉換說明符...

這篇文章有點晚了,但我不得不解決我需要從文件讀取和復制的情況,但我不知道文件的大小,並且所述文件的大小可能會改變,所以我需要一個確定大小的動態方法,以及使用 fseek() 和 ftell() 的方法,雖然不是按照原始答案中所述使用,但它僅在我將偏移量設置為 (0) 零時才有效,並且從哪里到結束文件,因此 fseek(FILE *ptr, 0, SEEK_END),然后簡單地使用 ftell() 來獲取原始答案中所述的值

取決於你需要多少聰明的數字轉換......如果你不需要特別聰明和快速,你可以用getc讀取一個類型的字符。 因此,從一個初始化為0的變量開始。讀取一個字符,將變量乘以10並添加新數字。 然后重復直到完成。 在整個過程中根據需要獲取更大尺寸的變量,或者從最大尺寸的變量開始,然后將其復制到完成后適合的最小尺寸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM