簡體   English   中英

使用fread從C中的文件讀取

[英]Reading from file in C using fread

我正在學習如何從C語言的文件中讀取內容。並且設法抓取以下代碼。

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


void read_content(FILE *file) {
  char *x = malloc(20);
  // read first 20 char
  int read = fread(x,sizeof(char),20,file);
  if (read != 20) {
     printf("Read could not happen\n");
   }
  else {
      printf("the content read is %s",x);
  }
  free(x);
  return; 
}

int main(int argc,char *argv[]) {

  FILE *fp; 
  fp = fopen("test.txt","w+");
  read_content(fp);
  fclose(fp);
  return 0;
}

但是由於某種原因(我無法理解),我將read字節數視為0

問題是您使用w+模式打開文件。 有兩種可能性:

  • 如果文件不存在,它將被創建為空。 立即從中讀取將給出文件結尾,導致fread()返回0。
  • 如果文件確實存在,它將被截斷,即更改為空文件。 立即從中讀取將給出文件結尾,導致fread()返回0。

如果只想讀取文件(按照您的示例),請在模式r打開它。 如果您想在不破壞其現有內容的情況下進行讀寫,請使用模式r+

無論選擇哪種模式,請始終檢查fopen()返回非null,如果返回null則顯示錯誤(這不是問題的原因,而是最佳實踐)。

從手冊 w+標志:

開放供閱讀和寫作。 如果該文件不存在,則創建該文件,否則該文件將被截斷。

您可能正在嘗試打開您提供的路徑中不存在的文件,或者如@WhozCraig在注釋中建議的那樣為read-only 這意味着正在創建一個新文件,一個空文件! 因此,您看到0字節的讀取。

綜上所述, fopen失敗,在這種情況下,您需要檢查返回值是否等於-1
要了解什么是錯誤,你可以檢查errno ,因為它被設置為顯示錯誤。

如果只打算讀取,請使用r標志而不是w+打開文件

問題在於以下代碼行:

fp = fopen("test.txt","w+") 

"w+"模式下,清除文件的先前內容,並且僅在不寫入任何內容的情況下讀取文件時,文件將為空。 因此,它正在打印"Read could not happen"因為您正在嘗試讀取一個空文件。

如果您願意讀取然后寫入文件,我建議您使用"r+"模式。 否則, r模式足以簡單讀取文件。

暫無
暫無

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

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