簡體   English   中英

從C中的文本文件讀取數據?

[英]Reading data from a text file in C?

因此,我在使用C語言從文本文件讀取數據方面還很陌生。我習慣於使用scanf或硬編碼來獲取輸入。

我正在嘗試學習如何不僅從文本文件讀取數據,而且如何處理該數據。 例如,假設一個名為bst.txt的文本文件具有以下信息,該信息用於對二進制搜索樹執行操作:

insert 10
insert 13
insert 5
insert 7
insert 20
delete 5
delete 10
....

對於該示例,我將具有以下代碼:

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

int main()
{ 
  FILE *fptr;
  char *charptr;
  char temp[50];

  fptr = fopen("bst.txt", "r");

  while(fgets(temp, 50, fptr) != NULL)
  {
    charptr = strtok(temp, " ");

    while(charptr != NULL)
    {
      charptr = strtok(NULL, " ");
    }
  }

return 0;
}

我知道在第一個while循環中strtok()會拆分文本文件中的每一行,而在第二個while循環中strtok()會在程序識別出空格時拆分,在這種情況下,這會將操作與整數分開。

所以我的主要問題是,例如,將單詞“ insert”與整數“ 10”分開后,如何使程序像這樣繼續:

if(_____ == "insert")
{
  //read integer from input file and call insert function, i.e. insert(10);
}

我需要填寫空白。

任何幫助將不勝感激!

您可以按如下方式調用。例如,我放置了printf但是您可以替換為insert/delete函數。

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

int main()
{ 
  FILE *fptr;
  char *charptr;
  char temp[50];

  fptr = fopen("bst.txt", "r");

  while(fgets(temp, 50, fptr) != NULL)
  {
    charptr = strtok(temp, " ");

    if(strcmp(charptr,"insert")==0)
    {
      charptr = strtok(NULL, " ");

      printf("insert num %d\n",atoi(charptr));
    }
    else if(strcmp(charptr,"delete")==0)
    {
      charptr = strtok(NULL, " ");

      printf("delete num %d\n",atoi(charptr));
    }
  }

return 0;
}

我認為讀取文件中格式化字符串的最佳方法是使用fscanf ,以下示例顯示了如何解析文件。 您可以存儲charptrvalue以進行進一步的操作:

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

int main()
{ 
  FILE *fptr;
  char charptr[50];
  int value;

  fptr = fopen("bst.txt", "r");

  while (fscanf(fptr, "%s%d", charptr, &value) > 0)
  {
      printf("%s: %d\n", charptr, value);
  }

  return 0;
}

試試這個代碼

int main(){
FILE *fp;
char character[50];
int value;
fptr = fopen("input.txt", "r");

while (fscanf(fp, "%s%d", character, &value) > 0)
{
  if(strcmp(character,"insert")==0){
      insert(value);//call you function which you want value is 10 or change according to file
  }
}
return 0;
}

如果我正在做您正在做的事情,那么我會那樣做:)

我看到很多人因推薦人們使用scanf()strtok()之類的功能而感到憤慨(不是在這里,我一般意思是說SO),盡管事實上這些功能被統一認為是邪惡的 ,不僅僅是因為它們不是線程安全的,但是因為它們以難以預測的方式修改了參數,並且調試起來非常痛苦。

如果您要malloc()ing用於讀取文件的輸入緩沖區,請始終使其至少為4kB-這是內核仍然可以為您提供的最小頁面,因此,除非您要進行不那么笨拙的100字節小分配malloc() ,您也可能會這樣,並且不要害怕分配10倍或100倍的價格,如果這樣可以使生活變得輕松。

因此,對於您正在處理輸入數據的少量文本文件的此類問題,您可以執行以下操作:

  • malloc()自己是一個很好的大緩沖區,足夠大,足以容納整個桶中的凈空
  • 打開文件,使用read()將整個該死的東西吞噬掉,然后關閉它
  • 記錄您在n_chars讀取了多少字節(或其他內容)
  • 一次通過緩沖區,然后1)用NUL替換所有換行符,然后2)將每行的開始(在換行符之后!)記錄到lines數組中的連續位置中(例如char **lines; lines=malloc(n_chars*sizeof(char *)) :行數不能超過字節!)
  • (可選)進行時,前進行開始指針以跳過前導空格
  • (可選)使用時,使用NUL覆蓋尾隨空白
  • 保持行數並保存在n_lines
  • 完成操作后,請記住free()該緩沖區

現在,你有什么? 您有一個字符串數組,它們是文件的行(可選,每行前導空格和尾隨空格都被去除),並且您可以使用它來做自己喜歡的事情。

所以你會怎么做?

像這樣一步一步地遍歷所有行:

for(i=0; i<n_lines; i++) {
    if( '\0'==*lines[i] || '#' == *lines[i] )
        continue;
    // More code

}

你也許忽略空行和一些由“#”開始。 您的配置文件現在有注釋!

long n;
int  len;
for(i=0; i<n_lines; i++) {
    if( '\0'==*lines[i] || '#' == *lines[i] )
        continue;
    // More code

    len = strlen("insert");
    if( 0== strncmp(lines[i], "insert", len) ) {
        n = strtol(lines[i]+len+1, &endp, 10);
        // error checking
        tree_insert( (int)n );
        continue;
    }

    len = strlen("delete");
    if( 0== strncmp(lines[i], "delete", len) ) {
        n = strtol(lines[i]+len+1, &endp, 10);
        // error checking
        tree_delete( (int)n );
    }
}

現在,您可能會看到使此代碼更好的10種方法。 我也是。 包含關鍵字和指向適當樹函數的函數指針的結構如何?

還有其他想法嗎? 把自己打昏!

暫無
暫無

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

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