我想加載一個像文件()中的數組文件()在PHP中的文本文件。我想能夠訪問像array [N](它應該包含整個文件中的第N行)不同的行,然後我需要刪除每個數組元素後使用它將減少大小,直到達到0和程序將結束。我知道如何讀取文件,但我不知道如何填充字符串數組以便像我說的那樣使用。我正在使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)進行編譯。將文本文件轉換爲純C中的字符串數組?
我該如何做到這一點?
我想加載一個像文件()中的數組文件()在PHP中的文本文件。我想能夠訪問像array [N](它應該包含整個文件中的第N行)不同的行,然後我需要刪除每個數組元素後使用它將減少大小,直到達到0和程序將結束。我知道如何讀取文件,但我不知道如何填充字符串數組以便像我說的那樣使用。我正在使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)進行編譯。將文本文件轉換爲純C中的字符串數組?
我該如何做到這一點?
我建議你將你的文件讀入一個指向字符串的指針數組中,這將允許你按照你指定的方式索引和刪除行。使用這種方法可以考慮效率的權衡,以提前計算行數還是在讀取每行時分配/擴展數組。我會選擇前者。
\n
或\r\n
)malloc()
分配緩衝區的每個,並通過下一個數組索引指向對於你的操作:
array[N]
array[N]
索引緩衝區,並設置array[N]
進入NULL
UPDATE:
通過提出的更多的內存高效的方法@r ..和@ marc-van-kempen是一個優於malloc()
的好方法,每次只讀一行,即將文件寫入單個緩衝區並替換所有行終止符s的'\0'
假設你這樣做,你有一個很大的緩衝區char *filebuf
和行數是int num_lines
那麼你可以分配你的索引數組是這樣的:
char *lines[] = (char **)malloc(num_lines + 1); // Allocates array of pointers to strings
lines[num_lines] = NULL; // Terminate the array as another way to stop you running off the end
char *p = filebuf; // I'm assuming the first char of the file is the start of the first line
int n;
for (n = 0; n < num_lines; n++) {
lines[i] = p;
while (*p++ != '\0') ; // Seek to the end of this line
if (n < num_lines - 1) {
while (*p++ == '\0') ; // Seek to the start the next line (if there is one)
}
}
有了一個緩衝接近「刪除」一行僅僅是將lines[n]
設置爲NULL
的一種情況。有沒有免費()
算法:
fseek
,ftell
,fseek
尋求結束,確定文件的長度,並尋求回到開頭。malloc
一個足夠整個文件加上空終止的緩衝區。fread
將整個文件讀入緩衝區,然後在末尾寫入一個0字節。malloc
來分配該號碼+ 1 char *
指針。一個優化:如果您不需要隨機訪問行(通過行號對它們進行索引),請取消指針數組,然後用0個字節替換所有換行符。然後s+=strlen(s)+1;
前進到下一行。您需要添加一些檢查以確保您不會超過緩衝區的末端(或開始,如果您正在反轉)。
無論哪種方式,這種方法是非常有效的(無內存碎片),但也有一些缺點:
兩個稍微不同的方式來實現這一點,一個是更多的內存友好,另一個更友善的CPU。
I存儲器友好
II CPU友好
或者只是在緩衝區中讀取文件,然後關閉它。使用更多的RAM,但由於僅執行一次I/O操作可能會更快 - 取決於操作系統是否爲您緩衝第一次讀取。 – 2010-07-09 01:35:14
我在哪裏可以讀取一些指針數組的示例?我知道行數會定義主數組的大小,但我不知道如何管理每個數組元素。 – jahmax 2010-07-09 01:44:03