2011-05-26 10 views
0

私は在庫ファイルをフォーマットするための小さなユーティリティを書いていますので、既存のデータベースにインポートすることができます。私はfscanfをやろうとする大きな問題を抱えています。私は過去数十万のファイルを読んできました。私はここで間違って何をしていますか?fopen()の問題

クリストファーの提案に基づく編集はまだNULLになっています。

#include <stdio.h> 
#include <string.h> 

int main() 
{ 

FILE* stream; 
FILE* output; 
char sellercode[200]; 
char asin[15]; 
string sku[15]; 
string fnsku[15]; 
int quality; 

stream = fopen("c:\out\dataextract.txt", "r"); 
output = fopen("c:\out\output.txt", "w"); 

if (stream == NULL) 
{ 
    return 0; 
} 

for(;;) 
{ 
    //if (EOF) break; 
    fscanf(stream, "%s", sku); 
    fprintf(output, "%s %s %s %s %i\n", sku, fnsku, asin, quality); 
} 
return 0; 
} 
+2

'char *文字列のtypedef;'また、あなたは(関数fscanfを使用しているように見えるC. –

答えて

2

問題の多くは、ここで実際にありますする必要があります。クリストファーとマア(コメント中)は、それらのいくつかについて言及しています。しかし、大きな問題は、データを読み書きするための領域を割り当てていないことです。

string sellercode = "";(P.S.、ないあなたはここでしか自分自身を傷つけている、「文字列」型を定義します)を持つことにより、あなたは、charの読み取り専用配列を指しています。実際には、あなたの記憶を破壊する危険にさらされている場合には、あなたのデータを読み込むためにここにいくつかのメモリを残しておく必要があります。

これらの変数を宣言する必要があります。

char sellercode[SOME_REASONABLE_SIZE]; 
char asin[SOME_REASONABLE_SIZE]; 
char sku[SOME_REASONABLE_SIZE]; 
char fnsku[SOME_REASONABLE_SIZE]; 

SOME_REASONABLE_SIZEのいくつかの値を持ちます。


常にファイルを明示的に閉じる必要があります。絶対に開かないでください。


最後に、パスでバックスラッシュを使用しているが、エスケープされていないことに気づいたことが最後に気づきました。あなたはそれらをエスケープする必要があります。

stream = fopen("c:\\out\\dataextract.txt", "r"); 
output = fopen("c:\\out\\output.txt", "w"); 
+0

それは価値情報ですが、なぜそれがヌルになるのかはまだ分かりません。 –

+1

@Joe:nullとは何ですか? 'ストリーム'?ファイルが存在しないか、ファイルを開く権限がありません。確実に知りたい場合は、 'errno'を調べるか、' perror() 'を使って説明的なメッセージを出力してください。あなたのパスにエスケープされていないバックスラッシュがあることに気付きます。 –

+0

そのようなファイルやディレクトリは私には伝えられていません。私はファイルの場所をコピーして以来、これは奇妙です。 –

4
if (stream = NULL) 
{ 
    return 0; 
} 

if (stream == NULL) 
{ 
    return 0; 
} 
+1

の深刻な危険な誤解を示す)とfprintfの()の両方が同じストリーム上;おそらくfprintf()で出力を使用することを意味します。 – mah

+0

ありがとう、さて、私のファイルがNULLになることを知っています。 –

+0

これらの変更を両方行いました。 –

0

バックスラッシュは文字列内のエスケープ文字です。パス名にスラッシュを使用します。 "C:/foo/bar.txt"

関連する問題