使用argv [1]作为文件名问题

时间:2014-06-05 15:16:02

标签: c++ pointers file-io cstring

我试图读取argv[1]命名的文件,但我不知道我是怎么做的。感觉它很简单,我在编译时得到的错误信息是

main.cpp: In function ‘void* ReadFile(char**, int&)’:
main.cpp:43:22: error: request for member ‘c_str’ in ‘*(argv + 8u)’, which is of non-class type ‘char*’
make: *** [main.o] Error 1

这是我的代码:

#include "movies.h"
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

void *ReadFile(char*[], int&);
int size;
int main(int argc, char *argv[])
{   
    char * title[100];

    cout << argv[1] << endl;
    //strcpy(argv[1],title[100]);
    //cout << title << endl;
    ReadFile(argv , size);

    return 0;
}

void *ReadFile(char * argv[] , int& size)
{
    char data;
    //char title[50];
    //strcpy(title,argv[1]);
    //cout << title << endl;
    ifstream fin;
    fin.open(argv[1].c_str()); //filename

    if (fin.good())
    {
        fin >> data;       
        cout << data << " ";                      
        while (!fin.eof( ))      
        {
            fin >> data; 
            cout << data << " ";               
        }
    }  
}

2 个答案:

答案 0 :(得分:5)

如错误所示,您尝试在非类类型上调用成员函数c_str()argv[1]是指向字符数组(C样式字符串)的指针,而不是类对象。

只需将指针传递给open()

fin.open(argv[1]);

你可以在c_str()对象上调用std::string,如果你有其中一个,但需要一个C风格的字符串。 (从历史上看,如果你有fin.open(),你必须这样做才能调用std::string;但是从C ++ 11开始,你可以直接传递该类型。

答案 1 :(得分:3)

.c_str()函数是为string个对象定义的,用于将其转换为char *。您正试图在char *上使用它。相反,请使用fin.open(argv[1]),因为它已经是C字符串。