簡體   English   中英

從c中的文件讀取數據

[英]reading data from file in c

我有一個名為prob的txt文件,其中包含:

  6 2 8 3
4   98652
      914
143   789
    1    
527   146
 85      
 1 74   8
7   6 3  

每行有9個字符,並且有9行。 由於我無法在c中創建字符串數組,因此我將使用二維數組。 仔細運行代碼,無窮循環是常見的,它會打印出奇怪的輸出。 我也很好奇它在哪里停止接收字符串? 直到換行? 每個“保存”的預期結果:6 2 8 3或擺動包含的行。

#include <stdio.h>
FILE *prob;

main()
{ 
    prob = fopen("prob.txt", "r");

    char grid_values[9][9];
    char save[9];

    int i;
    for (i = 0; (fscanf(prob, "%s", save) != EOF); i++)
    {
        int n;
        for (n = 0; n <= 9; n++)
        {
            grid_values[i][n] = save[n];
            printf("%c", grid_values[i][n]);
        }
    }
    fclose(prob);
}

這看起來像是一個作業問題,所以我會盡力為您提供一些建議。

首先,閱讀fscanf函數的描述和“%s”轉換的描述。

這是我對“%s”的描述中的一個片段:

匹配一系列非空格字符; 下一個指針必須是指向足夠長的字符數組的指針,以容納輸入序列和終止的空字符('\\ 0'),該字符將自動添加。 輸入字符串停在空白處或最大字段寬度處,以先到者為准。

以下是兩個要點:

  • 您的每行輸入均包含數字和空格字符。 因此該函數將讀取一個數字,到達空白,然后停止。 它不會讀取9個字符。
  • 如果確實讀取了9個字符,則數組中沒有足夠的空間來存儲所需的10個字節 注意,將添加“終止空字符”。 讀取9個字符,再加上1個null,等於10。這是C編程中的常見錯誤,最好現在學習始終在任何C字符串中說明終止空值。

現在,要解決此問題,可以將字符讀取到二維數組中:您需要使用其他函數。 查看您的C stdio函數列表。

看到有用的聲音了嗎?

如果您還沒有,我會給您一個提示:恐懼。 它將從輸入流中讀取固定數量的字節。 在您的情況下,您可以告訴它始終讀取9個字節。

僅在保證每行被填充為9個字符的情況下才有效。

另一個功能是fgets。 同樣,請仔細閱讀功能文檔。 fgets是另一個函數,它附加一個終止null。 然而! 在這種情況下,如果您告訴fgets大小為9,則fgets將僅讀取8個字符,並且它將終止空值寫入第9個字符。

但是還有另一種方式! 回到fscanf!

如果您查看其他轉換說明符,則可以使用“%9c”讀取9個字符。 如果使用操作,它將不會在字符串中添加終止null。

使用fread和fscanf“%9c”時,如果要在其他函數(例如printf)中將這9個字節用作字符串,則需要將緩沖區設置為10個字節,並且在每個fread或fscanf函數之后,都需要寫save[9] = '\\0'

請務必仔細閱讀文檔。 C字符串函數有時會以一種方式做到這一點。 但不總是。

如果使用fscanf ,它將在空格分隔符后停止。

嘗試fgets來做..它將逐行讀取..

for (i = 0; (fgets(save, sizeof(save), prob) != EOF); i++)

fgets使用的詳細信息可以在這里找到:
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

--edited--

這是第二個

while(!feof(file))
{
    fgets(s, sizeof(s), file); ......
}

我認為它會很好..

暫無
暫無

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

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