0

ヌービーアラート。うーん。<stdio.h>または<fstream>. _ どちらも非常に扱いにくく、直感的に使用できないようです。つまり、なぜ C++char*はファイルの最初の char へのポインタを取得する方法を提供できなかったのでしょうか? 私が望むのはそれだけです。

Project Euler Question 13をやっていて、50 桁の数字で遊ぶ必要があります。ファイルに 150 個の数字が保存されており13.txt、各数字の数字を直接操作できるように 150x50 の配列を作成しようとしています。しかし、私はたくさんの問題を抱えています。私は C++<fstream>ライブラリを使用してみましたが、最近はすぐ<stdio.h>にそれを完了できましたが、何かがクリックされていないに違いありません。これが私が持っているものです。

#include <iostream>
#include <stdio.h>
int main() {

const unsigned N = 100;
const unsigned D = 50; 

unsigned short nums[N][D];

FILE* f = fopen("13.txt", "r");
//error-checking for NULL return

unsigned short *d_ptr = &nums[0][0];
int c = 0;
while ((c = fgetc(f)) != EOF) {
    if (c == '\n' || c == '\t' || c == ' ') {
        continue;
    }   
    *d_ptr = (short)(c-0x30);
    ++d_ptr;
}   
fclose(f);
//do stuff
return 0;
}

誰かアドバイスをいただけますか?おそらく、どの I/O ライブラリを好む C++ の人でしょうか?

4

3 に答える 3

1

私はfstreamを使用します。あなたが抱えている問題の1つは、ファイル内の数値をC ++のネイティブ数値タイプ(double、long longなど)のいずれにも適合できないことです。

ただし、文字列への読み取りは非常に簡単です。

std::fstream in("13.txt");

std::vector<std::string> numbers((std::istream_iterator<std::string>(in)),
                                  std::istream_iterator<std::string>());

これにより、各数値が文字列に読み込まれるため、最初の行にあった数値は、、numbers[0]2番目の行はnumbers[1]、というようになります。

あなたが本当にCで仕事をしたいのなら、それでもあなたが上に持っているものよりもかなり簡単かもしれません:

char *dupe(char const *in) {
    char *ret;
    if (NULL != (ret=malloc(strlen(in)+1))
        strcpy(ret, in);
    return ret;
}

// read the data:
char buffer[256];
char *strings[256];
size_t pos = 0;

while (fgets(buffer, sizeof(buffer), stdin)
    strings[pos++] = dupe(buffer);
于 2013-01-26T00:26:27.863 に答える
1

これは素晴らしい効率的な解決策です(ただし、パイプでは機能しません):

std::vector<char> content;
FILE* f = fopen("13.txt", "r");
// error-checking goes here
fseek(f, 0, SEEK_END);
content.resize(ftell(f));
fseek(f, 0, SEEK_BEGIN);
fread(&content[0], 1, content.size(), f);
fclose(f);

ここに別のものがあります:

std::vector<char> content;
struct stat fileinfo;
stat("13.txt", &fileinfo);
// error-checking goes here
content.resize(fileinfo.st_size);
FILE* f = fopen("13.txt", "r");
// error-checking goes here
fread(&content[0], 1, content.size(), f);
// error-checking goes here
fclose(f);
于 2013-01-26T00:51:04.407 に答える
0

ファイルから150桁の数字を読み取るのではなく、文字定数から直接読み取ってみませんか?

次のコードから始めることができます。

static const char numbers[] = 
 "37107287533902102798797998220837590246510135740250"
 "46376937677490009712648124896970078050417018260538"...

最後の行にセミコロンがあります。

于 2013-01-26T00:37:18.973 に答える