簡體   English   中英

C語言 - unix環境中的Fscanf和sprint命令

[英]C language - Fscanf and sprint commands in unix environment

我正在嘗試使用“tab”分隔符讀取包含30行和5列的文件。 每次我只獲得部分行。 在Windows環境中它運行良好。 知道為什么在unix中它不起作用?

while (fscanf(FFMapFile, "%s\t%s\t%s\t%s\t%s\t", fnfMap[i].COS_ID, fnfMap[i].FF_First_Act, fnfMap[i].FF_Next_Act, nfMap[i].Free_FF_allowed, fnfMap[i].FF_Change_Charge) != EOF)
{ 
    sprintf(s,"%s\t%s\t%s\t%s\t%s\t", nfMap[i].COS_ID, fnfMap[i].FF_First_Act, fnfMap[i].FF_Next_Act, fnfMap[i].Free_FF_allowed, fnfMap[i].FF_Change_Charge);
    error_log(s,ERROR);
    i++; }

你的fscanf()字符串中的\\ t字符不是必需的 - 制表符是空格,所以你也可以說“%s%s%s%s” - 可以想象,兩個scanf實現對它們的處理方式不同。 此外,您應該檢查fscanf返回EOF以外的值但不等於預期轉換的數量,這表示某種轉換錯誤。

成功時, fscanf返回成功讀取的項目數。 此計數可以匹配預期的數量,或者在匹配失敗的情況下更少。

您應該檢查fscanf的返回值以查看未正確解析的行並檢查輸入數據。

更仔細地檢查fscanf()的返回值; 例如,如果匹配3個字段,它將返回3。 您可能需要注意各種字符串的大小以避免緩沖區溢出 - 但是,這可能是另一天的主題。

令我fscanf()的可能性是格式字符串中的最后一個選項卡可能更好作為換行符 - 但fscanf()通常對格式字符串和數據中的空格采取相當自由的態度。

這個簡化(但完整,有效)的代碼版本在MacOS X上或多或少地表現得很好。

#include <stdio.h>

int main(void)
{
    char b1[20], b2[20], b3[20], b4[20], b5[20];
    while (fscanf(stdin,"%s\t%s\t%s\t%s\t%s\t", b1, b2, b3, b4, b5) == 5)
        printf("%s\t%s\t%s\t%s\t%s\n", b1, b2, b3, b4, b5);
    return 0;
}

但是,它確實將字符串' kkkkk '(由空格分隔的5個單個字母)視為等效,以5個制表符分隔。 因此,問題是C標准的第7.19.6.2節規定:

格式由零個或多個指令組成:一個或多個空格字符,普通的多字節字符(既不是%也不是空白字符),或轉換規范。

除非規范包含[,c或n說明符,否則將跳過輸入空白字符(由isspace函數指定)。

另外,關於'%s'說明符,它說:

匹配一系列非空白字符。

要強制匹配實際標簽,您必須更加努力地工作。 求助於“將一行讀入緩沖區( fgets() )並手動拆分”會更容易。 這也允許您在一行上強制執行5個單詞,如果字段太少或太多,您可以生成錯誤或警告。 使用fscanf() ,你不能這樣做。 如果你在一行上鍵入8個單詞,它將在第一次讀取前五個單詞,然后在行上讀取剩余的三個單詞加上下一個單詞的前兩個單詞,依此類推。

暫無
暫無

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

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