[英]How can I read a specific line from a file, in C?
好吧:所以我有一個文件,我必須使用它來做。 過度簡化,文件具有以下格式:
n
first name
second name
...
nth name
random name
do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾
random name
do x⁽²⁾, y⁽²⁾, z⁽²⁾
...
random name
do x⁽ⁿ⁾, y⁽ⁿ⁾, z⁽ⁿ⁾
因此,實際細節並不重要。 問題是:我必須聲明一個變量n,我有一個數組名[MAX],然后用名稱(從name [0]到name [n-1])填充此數組。
好的,問題是:如果以前不知道我有多少個名字,如何獲得此輸入?
例如,如果這是用戶通過鍵盤輸入的內容,我可以做到這一點:我可以這樣做:
int n; char name[MAX];
scanf( "%d", &n);
int i; for (i = 0; i < n; i++)
scanf( "%s", &N[i]);
我可以繼續進行全部代碼,但是您明白了。 但是,我的輸入現在來自文件。 我不知道如何獲取輸入,我只能做fscanf()整個文件,但是由於我不知道它的大小(第一個數字會確定它的大小),所以我不能這樣做。 據我所知(如果不正確,請更正我,我對此很陌生),我們不能使用命令“ for”來逐漸獲取數字,就好像是從鍵盤來的一樣,對嗎?
因此,我看到的唯一出口是找到一種從文件中讀取特定行的方法。 如果我可以做到,剩下的就很容易了。 問題是,我該怎么辦? 我用谷歌搜索,甚至沒有發現任何問題。 顯然,從文件中讀取特定行確實很復雜。
這是來自初學者的問題集,因此我懷疑它是否太復雜了。 我一定會錯過一些非常簡單的東西,盡管我只是不知道它是什么。
因此,問題是:例如,您將如何做?
如何掃描文件中的第一個數字n,然后掃描其他“ n”個名稱,將每個名稱分配給數組中的一個元素(名字= name [0],姓= name [n-1]) ?
我建議調查文件結尾。
while(!eof(fd))
{
...code...
}
請注意,我的C語言知識很生銹,但這應該可以幫助您入門。
IIRC eof返回值(-1),這就是為什么您需要將其與某些值進行比較的原因。 這里fd是您正在讀取的文件的文件描述符。 然后,在解析文本或行數之后,您將得到“ n”。
編輯:既然我顯然更累了,那么我想(沒注意到您的'n'在頂部)。
讀取第一行malloc中的'n'大小數組,以循環訪問名稱。
由於給定的格式似乎暗示名稱的數量n
作為文件中的第一個條目給出,因此從stdin讀取時可以使用OP描述的讀取方式。 使用fscanf
從文件( n
)中讀取第一個整數,然后使用malloc
為名稱分配數組,然后使用直到n
的for
循環讀取名稱。
但是,我不確定示例數據的含義是否遵循do x⁽¹⁾, y⁽¹⁾ and z⁽¹⁾
格式。 也許我不理解問題的一部分。 如果這意味着可能有n
名稱,則可以使用realloc
增加數組的大小。 增長陣列的一種常見方法是每次將長度加倍。
在這里,您可以開始學習。我將編譯和調試作為學生的練習。
想法是如果文件總是很小,則將整個文件包含到單個數組中。 這比scanf()更有效。
char buf[100000], *bp, *N[1000]; // plenty big memset( buf, '\0', sizeof buf ); if ( fgets( buf, sizeof(buf), fd ) ) { int n = 0; char *bp; if ( buf[(sizeof buf)-2)] != '\0' ) { // file too long for buffer printf( stderr, "trouble: file too large: %d\n", (int)(sizeof buf)); exit(EXIT_FAILURE); } // now replace each \n with a \0, remembering where each line is. for ( bp = buf, bp = strchr( bp, '\n' ); bp++ ) N[n++] = bp; }
如果要讀取任何大小的文件,則需要以塊的形式讀取文件,在讀取之前對每個塊進行calloc(),並仔細處理當前緩沖區末尾的行片段,以將它們移至下一個緩沖區,然后正確繼續閱讀。 除非您對可以讀取的行數有限制,否則可能還需要以塊的形式設置N,但是這次remalloc()可能是您的朋友。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.