C ++文件I / O问题

时间:2013-01-26 00:20:30

标签: c++ file-io

Noobie Alert。 啊。我在使用<stdio.h><fstream>完成基本文件I / O操作时遇到了一些麻烦。它们看起来都很笨重而且不直观。我的意思是,为什么C ++不能提供一种方法来获取指向文件中第一个字符的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 ++人?

3 个答案:

答案 0 :(得分:1)

我会使用fstream。你遇到的一个问题是你显然无法将文件中的数字放入任何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]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);

答案 1 :(得分: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);

答案 2 :(得分:0)

不是从文件中读取一百个50位数字,为什么不直接从一个字符常量中读取它们呢?

你可以用以下代码开始你的代码:

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

在最后一行加分号。