簡體   English   中英

fread 和 fgets 的規格之間的區別?

[英]Difference between specifications of fread and fgets?

從文件讀入時 fread 和 fgets 有什么區別? 我使用相同的 fwrite 語句,但是當我使用 fgets 讀取 .txt 文件時,它按預期工作,但是當我使用 fread() 時卻沒有。

在讀取和讀取文件時,我已從 fgets/fputs 切換到 fread/fwrite。 我使用 fopen(rb/wb) 讀取二進制而不是標准字符。 我知道 fread 也會得到 /0 Null 字節,而不僅僅是單行。

  //while (fgets(buff,1023,fpinput) != NULL) //read in from file
  while (fread(buff, 1, 1023, fpinput) != 0) // read from file

我希望從文件讀入緩沖區,將緩沖區放入共享內存中,然后讓另一個進程從共享內存中讀取並寫入新文件。

當我使用 fgets() 時,它可以按預期與 .txt 文件一起工作,但是當使用 fread 時,它將一行 300~ 個字符的單行添加到緩沖區中並換行。 不能為我的生活弄清楚為什么。

fgets會在遇到換行符時停止。 fread沒有。 所以fgets通常只對文本文件有用,而fread可用於文本和二進制文件。

來自 C11 標准:

7.21.7.2 fgets 函數

fgets 函數從 stream 指向的流中讀取至多比 n 指定的字符數少 1 到 s 指向的數組中。 在換行符(保留)后或文件結束后不會讀取其他字符。 在讀入數組的最后一個字符后立即寫入空字符。

7.21.8.1 fread 函數

fread 函數從 stream 所指向的流中將最多大小由 size 指定的 nmemb 元素讀入 ptr 所指向的數組中。 對於每個對象,都會對 fgetc 函數進行 size 調用,並將結果按讀取順序存儲在正好覆蓋該對象的無符號字符數組中。 流的文件位置指示符(如果已定義)按成功讀取的字符數前進。 如果發生錯誤,則流的文件位置指示符的結果值是不確定的。 如果讀取了部分元素,則其值是不確定的。

這個片段可能會讓你更清楚。 它只是分塊復制文件。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
    if(argc != 3) {
        printf("Usage: ./a.out src dst\n");
        printf("Copies file src to dst\n");
        exit(EXIT_SUCCESS);
    }

    const size_t chunk_size = 1024;

    FILE *in, *out;
    if(! (in = fopen(argv[1], "rb"))) exit(EXIT_FAILURE);
    if(! (out = fopen(argv[2], "wb"))) exit(EXIT_FAILURE);

    char * buffer;
    if(! (buffer = malloc(chunk_size))) exit(EXIT_FAILURE);

    size_t bytes_read;

    do {
        // fread returns the number of successfully read elements
        bytes_read = fread(buffer, 1, chunk_size, in);

        /* Insert any modifications you may */
        /* want to do here                  */

        // write bytes_read bytes from buffer to output file
        if(fwrite(buffer, 1, bytes_read, out) != bytes_read) exit(EXIT_FAILURE);
   // When we read less than chunk_size we are either done or an error has 
   // occured. This error is not handled in this program. 
    } while(bytes_read == chunk_size); 


    free(buffer);
    fclose(out);
    fclose(in);
}

您在下面的評論中提到您想將其用於字節交換。 好吧,您可以只使用以下代碼段。 只需將其插入到上面代碼中指示的位置即可。

for(int i=0; i < bytes_read - bytes_read%2; i+=2) {
    char tmp = buffer[i];
    buffer[i] = buffer[i+1];
    buffer[i+1] = tmp;
}

暫無
暫無

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

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