【问题标题】:Using const char* to read in multiple file names使用 const char* 读取多个文件名
【发布时间】:2019-10-20 23:21:42
【问题描述】:

我正在编写一个函数,它使用 ifstream 将 10 个 .pgm 文件读入二维数组 images

void readPGMImages ( unsigned char images [784][10], int img_size ,
                    const char * filename , int imgNum ){...

其中第一个维度img_size 是图像中的“像素”数(0-783),第二个维度imgNum 是图像数(0-9)。我遇到麻烦的地方是,每次图像编号更改时,我都需要使用const char* filename 来读取新文件标题。我只是不明白如何正确存储filename 的值或如何使用const char* 读取名称。

void readPGMImages ( uchar images [784][10], int img_size ,
                const char * filename , int imgNum ){

filename = "digit_00.pgm","digit_01.pgm","digit_02.pgm","digit_03.pgm","digit_04.pgm","digit_05.pgm","digit_06.pgm","digit_07.pgm","digit_08.pgm","digit_09.pgm";
    int header;
    ifstream PGM ;
    PGM.open(filename);
    for (imgNum = 0; imgNum<10; imgNum++){
        PGM.open(filename);
        PGM >> header >> header >> header >> header ; // this is b/c the first 4 characters of each are unused
            for (img_size = 0; img_size<784 ; img_size++){
                PGM >> images[img_size][imgNum];
                }
        const char* ++; // this is kind of pseudo code for what I am trying to accomplish 
                }

文件名是

filename = "digit_00.pgm","digit_01.pgm","digit_02.pgm","digit_03.pgm","digit_04.pgm","digit_05.pgm","digit_06.pgm","digit_07.pgm","digit_08.pgm","digit_09.pgm";

总之,我有一个指针const char* 指向filename,第一次迭代需要const char* filename = digit_00.pgm,然后第二次迭代需要filename = digit_01.pgm,依此类推。

如果我不需要使用const char*,我会创建一个字符串数组并在 for 循环中递增字符串,但这不是我要解决的问题。

提前非常感谢您!我会监视线程以清除任何内容。

【问题讨论】:

  • std::string 有一个成员函数 c_str(),它返回一个以空值结尾的 cstring。您可能对此感兴趣。

标签: c++


【解决方案1】:

欢迎来到 Stack Overflow!

看起来你的一些变量,const char* filenameint imgNum,是你的函数的输入,但你忽略了传入的任何值,并在功能。相反,假设您打算将它们用作函数的私有变量,您应该将它们设为本地变量(如您的 int header;ifstream PGM;)。

另一个问题是这一行实际上并没有存储所有 10 个不同的文件名:

filename = "digit_00.pgm","digit_01.pgm","digit_02.pgm","digit_03.pgm","digit_04.pgm","digit_05.pgm","digit_06.pgm","digit_07.pgm","digit_08.pgm","digit_09.pgm";

相反,它使用the comma operator 忽略前9 个并且只存储filename = "digit_09.pgm";。相反,您可以在循环内使用数组const char *filenames[10]filenames[imgNum],或者您可以从当前的imgNum 中使用build the string dynamically,然后按照上面评论中的建议使用.c_str()

【讨论】:

  • 感谢您的帮助! fiIename=... 更像是一个伪代码示例。我曾尝试使用const char *filenames[10],但我得到一个重新定义具有不同类型的“文件名”:'const char *[10]' vs 'const char *' 错误如何更改参数让一切融合在一起。
  • 您真的希望filename 作为函数的输入传递吗?该错误来自尝试使用完全相同名称的 2 个变量。您应该使名称不同,或者最好删除其中一个变量,因为没有理由让它既是输入变量又是局部变量。
  • 该死的我说得太早了我在PGM.open(filename[imgNum]); 中收到一个错误,错误是No matching member function for call to 'open' 你知道为什么会这样吗?我在函数之前定义了const char* filename[10],它现在可以作为输入传入。
  • 好吧,我看到我没有通过filenames**[10]**,我只是输入了const char *filenames。一切似乎都很好。我无法告诉你我对你的帮助有多感激。谢谢!
  • 不客气!将来我会建议包含更多您的真实代码并清楚地标记哪些部分是伪代码;这将使您更清楚您遇到了什么问题以及您正在尝试做什么。另见How to Askminimal reproducible example
猜你喜欢
  • 2012-03-17
  • 2021-12-04
  • 1970-01-01
  • 2011-01-07
  • 2018-07-12
  • 1970-01-01
  • 2014-12-14
  • 2021-05-05
  • 2014-03-08
相关资源
最近更新 更多