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 ++人?
答案 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"...
在最后一行加分号。