[英]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
,以下示例顯示了如何解析文件。 您可以存儲charptr
和value
以進行進一步的操作:
#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
讀取了多少字節(或其他內容) lines
數組中的連續位置中(例如char **lines; lines=malloc(n_chars*sizeof(char *))
:行數不能超過字節!) 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.