簡體   English   中英

從C中的同一個文件中讀取int和char

[英]Read int and char from the same file in C

我有一個看起來像這樣的文本文件:

i 3755
i 3633
i 4435
i 1434

我將如何閱讀這個作為輸入,我嘗試使用fscanf,但它繼續在'i'后給我一個隨機字符

例如輸出看起來像

我%3755

i5 3633

等等

這是我一直在嘗試的:

    int data = 0; 
char command; 
if(fptr==NULL)
    printf("File Cannot Be Read"); 

fscanf(fptr,"%c %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data);

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data); 

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%s " , command);
printf("%d\n" , data);

他們似乎都沒有工作。 感謝您的幫助!

編輯:對於遇到同樣問題的人來說,工作代碼是:

int data = 0; 
char command; 
fptr = fopen(argv[1], "r"); 

if(fptr==NULL)
    printf("File Cannot Be Read"); 

while(fscanf(fptr,"%c %d \n", &command, &data) == 2)
{

        if(command == 'i')
        {
            printf("insert found\n");
        }
            if(command == 'd')
        {
            printf("delete found\n");
        }

} 

}

fscanf(fptr,"%c %d", command, &data); 

應該:

fscanf(fptr,"%c %d", &command, &data); 
getchar();  // consume the newline character that fscanf left.

假設你定義了:

char command;
int data;

為簡單起見,我建議您在循環中使用fgets()讀取一行,然后使用strtok()獲取不同的“字符串”,然后根據您的解析方法進行轉換。 但邁克也是對的,你可以使用fscanf(fptr, "%c %d\\n", &command, &data)來閱讀。 當您使用字符串時,可以忽略變量名稱前的“ & ”用法。 但是當它是一個字符或整數或浮點數時......你需要使用運算符的地址(“ & ”)

這是不正確的,將導致緩沖區溢出:

fscanf(fptr,"%s %d", &command, &data);

因為command只有一個char有足夠的空間,但是格式說明符為"%s" fscanf()將讀取直到下一個空格,然后將終止空字符寫入command 使用char[]讀取和限制要讀取的char數。

請注意, NULL檢查只是打印一條錯誤消息,它實際上並不會阻止使用NULL文件指針。


要確保每行的格式正確,請使用fgets()讀取一行,然后使用sscanf()讀取字段。 如果fscanf()用於直接從文件中讀取,那么這兩行:

i
3755

被視為與單行相同:

i 3755

作為一個新行字符也是空白。 例:

if (fptr)
{
    char line[1024];
    while (fgets(line, 1024, fptr))
    {
        char command;
        int data;
        if (2 == sscanf(line, "%c %d", &command, &data))
        {
            /* Use 'command' and 'data'. */
        }
    }
}

在這一行:

fscanf(fptr,"%c %d", command, &data); 

你應該給它一個命令指針。 像這樣 :

fscanf(fptr,"%c %d", &command, &data); 

下一行無法工作,因為讀取光標已經在文件的末尾。

在你的fscanf函數中,你必須通過在格式末尾添加空格來期望返回行。 像這樣

fscanf(fptr,"%c %d ", &command, &data);

空格字符替換返回到新行,制表和空格

順便說一下,我看到您使用%s來讀取字符&command ,這是不正確的

fscanf(fptr,"%s %d\n", &command, &data); 

你必須改用它

fscanf(fptr,"%c %d ", &command, &data); 

暫無
暫無

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

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