簡體   English   中英

如何在C中從文件讀取特定行?

[英]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為名稱分配數組,然后使用直到nfor循環讀取名稱。

但是,我不確定示例數據的含義是否遵循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.

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