0

network.datという名前のファイルから読み取るコードを作成しました

私が書いたコードは

    f = fopen("network.dat", "r");
    if(f == NULL)
        exit(1);
    int read, N;

    printf("%p\n", f);//output file pointer, included this just to check if file is opened properly
    fscanf(f, "%d%d", &N, &read);//error here
    cout<<N; 

ファイルは正しく開か49897488れ、出力としてファイルポインタ()を取得していますが、それに続く行はプログラムが機能しなくなりN、出力として取得されません。他の詳細が必要かどうか教えてください。network.datの内容は

10 1
1   6   1.28646
1   7   1.2585
2   9   1.33856

等々。ファイルの最初の2つの数字、つまり10と1に焦点を当てています。

4

4 に答える 4

1

scanf() フォーマット文字列が正しくありません。"%d,%d" は、コンマで区切られた 2 つの整数を検索します。空白で区切られた 2 つの整数を読み取りたい場合は、"%d%d" を実行します。

于 2012-09-02T19:56:55.337 に答える
1

これはSrijanで動作するようです。このコードは手早く汚いカット アンド ペースト作業であり、スタイルはゼロ ポイントですが、テストとしては機能します。レコードのフィールド数は、印刷フォーマット文字列のフィールドと一致する必要があるようです。1.9999 のレコード 1 のテスト データに 3 番目のフィールドを追加したところ、機能しました。これが技術的に純粋な説明であるとは思えません。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <cstring>
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
using std::ios;

int main(int argc, char *argv[])
{
//int read;
//int N;
int res;
FILE *f;


f = fopen("network.dat", "r");
    if(f == NULL)
        exit(1);
    int read, N;
    float f3;

    printf("%p\n", f);//output file pointer, included this just to check if file is opened properly
    for (;;)
        {
    res = fscanf(f, "%d%d%f", &N, &read, &f3);//error here
    if (res <= 0)
        {
        printf("err %d\n",errno);
        break;
        }
    cout<<N << " " << read << "\n";
        }
}
于 2012-09-03T02:40:10.430 に答える
0

コードでは、最初の空白までのファイル内のすべての文字がintであると想定しています。ファイルがintで始まらない場合は、それが失敗の原因である可能性があります。

于 2012-09-02T19:47:24.750 に答える
0

私のコメントで述べたように、問題はフォーマット指定子が正しくないことです。試す

fscanf(f, "%d%d", &N, &read);

あなたが使用しcoutているので、これは実際にはC++コードであると推測しています...正直なところ、これを正規のCの方法で行うべきではありません。代わりに、を使用してifstreamください。

std::ifstream input("network.dat");
int N, read;
input >> N >> read;
std::cout << N << ' ' << read << std::endl;
于 2012-09-02T19:59:43.550 に答える