2016-12-26 10 views
3

私はfwriteを使ってデータを保存しましたが、今はfreadを使って処理するためにtxtファイルからデータを読み込もうとしています。私は値を個別に読んでみたいですが、あなたがそれをどうやって行うのか分かりません。これは、私が試したものです:freadを使用してファイル値を値で読み取るにはどうすればよいですか?

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

int main() 
{ 
    FILE * pFile; 
    long lSize; 
    unsigned short * buffer; 
    size_t result; 

    pFile = fopen ("myfile.txt" , "rb"); 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize); 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 

    printf("%uz\n", result); 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

上記のプログラムは、罰金コンパイルが、私は./a.outでそれを実行したとき、私はセグメンテーションフォールトを取得します。私がsudo ./a.outでそれを走らせるとき、私はseg faultを取得しませんが、何も出力しません。 私はそれを修正するために何ができますか?私が見

+0

は、ここにチェックをいくつかのエラーを行い読書は、あなたは確かに使用できる1

ずつオブジェクト


fopen( "myfile.txt"、 "rb"); ' –

+0

@πάνταῥεῖ何をwo uldチェックしますか?それはファイルを開くだけです。私がファイル名を正しいものにする限り、正常に動作するはずです。 –

+0

あなたは 'NULL'に対して戻り値をチェックしませんでした! –

答えて

1

問題:

lSize = ftell (pFile); 

lSize

を必要以上のメモリを割り当てるには、ファイル内の文字の数ではなく、unsigned short秒の数に設定されています。したがって、必要があります

buffer = malloc(lSize); 

Do I cast the result of malloc?を参照してください。 C++コンパイラを使用している場合(C++というタグが示すように)、返される値はmallocです。

間違った書式指定子は

printf("%s\n", result); 

resultを印刷するには、間違った書式指定子を使用しています。あなたは使用する必要があります

printf("%zu\n", result); 

この行は、見ているセグメンテーションフォルトの最も可能性の高い原因です。

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    unsigned short number; 
    result = fread (&number, sizeof(unsigned short), 1, pFile);   
} 

ます。また、使用することができます: `PFILE =:

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    result = fread (buffer+i, sizeof(unsigned short), 1, pFile);   
} 
+0

しかし、ファイルに書き込まれる値はunsigned short型です。あなたが言ったことをすると、私はちょうどスクリーンに「1z」の束を印刷します。 –

+0

'fread'の戻り値は読み込まれたオブジェクトの数です。一度に1つのオブジェクトを読み込むと、 'result'の値は' 1'になります。私が提案した形式のエラーのため、出力として '1z'が表示されています。それは ''%uz ''の代わりに' '%zu''にする必要がありました。私は答えに誤りを修正しました。 –

関連する問題