以下をG
使用してテキストファイルに出力したMATLABの行列があります。
file = fopen('G.dat','w');
fprintf(file, [repmat('%f\t', 1, size(G, 2)) '\n'], G');
fclose(file);
この行列の次元は100x 500です。たとえば、awkを使用して行と列を数える場合、
cat G.dat | awk '{print NF}END{print NR}'
寸法が元の寸法に対応していることがわかります。
ここで、次のように列の次元を理解するためだけに、最初の行の列をカウントするCプログラムからこのファイルG.datを読み取りたいと思います。
while (!feof(file) && (fscanf(file, "%lf%c", &k, &c) == 2) ) {
Ng++;
if (c == '\n')
break;
}
残念ながら、Ng = 50000になり、「\ n」を認識しません。代わりに、データをコピーして貼り付けるだけでテキストファイルを作成すると、機能します。理由を説明してもらえますか?ありがとう!
コードのアプローチは脆弱すぎて、「列の次元を理解するためだけに最初の行の列を数える」ことはできません。fscanf(file, "%lf%c"...
バリアントの空白区切り文字とEOLの影響を受けやすく、を検出できません'\n'
。
空白を明示的に調べて幅を決定することをお勧めします。
// return 0 on success, 1 on error
int GetWidth(FILE *file, size_t *width) {
*width = 0;
for (;;) {
int ch;
while (isspace(ch = fgetc(file))) {
if (ch == '\n') return 0;
}
if (ch == EOF) return 0;
ungetc(ch, file);
double d;
if (fscanf(file, "%lf", &d) != 1)) {
return 1; // unexpected non convertible text
}
(*width)++;
}
}
//Sample, usage
size_t width;
if (GetWidth(file, &width)) return 1;
// read entire file
rewind(file);
for (size_t line = 0; foo(); line++)
for (size_t column = 0; column<width; column++) {
double d;
if (fscanf(file, "%lf", &d) != 1)) {
break; // EOF, unexpected non convertible text or input error
}
}
...
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加