filename:“读取字符串字符的错误”和“无法读取内存”

时间:2014-07-02 16:00:26

标签: c++ filenames ifstream

从参数中读取文件名时会给出这些错误。

“无法读取内存” “读取字符串字符的错误”

如果字符串被定义为用户输入的文本或硬键,那么它可以正常工作。但是,如果文件名的一部分是从文件中读取的,则连接然后通过参数传递,则会给出这些错误。

无论有没有.c_str()我都试过了 删除文本文件中的一些杂散空格后,现在可以在windows中使用,但不能在linux中使用吗?

        void batch_helper()
        {

            //batch
            vector <string> field_reports;

            ifstream field_report_batch;
            field_report_batch.open("OCR_batch.txt");
            string line;

            while (true) { //fill stack with batches
                getline(field_report_batch, line);
                if (line.empty() || !field_report_batch || field_report_batch.fail())
                    break;

                field_reports.push_back(line);
            }
            field_report_batch.close();

            for (unsigned int i = 0; i < field_reports.size(); i++) {

                parse_file("timesheets_we" + field_reports[i] + "_batch_export.csv"); //this does not work

                //parse_file("timesheets_we20121221_batch_export.csv"); //this works

            }

        }



        void parse_file(const string timecard_WE)
        {

            //count records
            int timecard_count = 0;
            string line;

            //test input file
            ifstream timecard_test;
            timecard_test.open(timecard_WE.c_str());
            getline(timecard_test, line); //burn header
            while (true){
                getline(timecard_test, line); //read in row_n
                if (!timecard_test || timecard_test.fail()) 
                    break;
                timecard_count++;
            }
            timecard_test.close();
            line.clear();
    }

在stackoverflow上发布的类似问题是here,问题是隐藏的空格或行末尾的char。我检查了空白区域,但到目前为止还没找到它们。

我会试试这个:

           while (true) {
                if (line.back() == '\r' || line.back() == '\n') {
                    test_log << "pop: " << line.back() << "\r\n";
                    line.pop_back();
                }
            }

生成的文件是

  

20120615

     

pop:

     

20120622

     

pop:

     

20120629

     

pop:

     

20120706

     

pop:

     

20120713

     

pop:

     

20120720

     

pop:

     

20120727

     

pop:

     

20120803

     

pop:

     

20120810

     

pop:

     

20120817

     

pop:

     

20120824

     

pop:

     

20120831

     

pop:

     

20120907

     

pop:

     

20120914

     

pop:

     

20120921

     

pop:

     

20120928

     

pop:

     

20121005

     

pop:

     

20121012

     

pop:

     

20121019

     

pop:

     

20121026

     

pop:

     

20121102

     

pop:

     

20121109

     

pop:

     

20121116

     

pop:

     

20121123

     

pop:

     

20121130

     

pop:

     

20121207

     

pop:

     

20121214

     

pop:

     

20121221

     

pop:

     

timesheets_we20120615_batch_export.csv BREAK   timesheets_we20120622_batch_export.csv BREAK   timesheets_we20120629_batch_export.csv BREAK   timesheets_we20120706_batch_export.csv BREAK   timesheets_we20120713_batch_export.csv BREAK   timesheets_we20120720_batch_export.csv BREAK   timesheets_we20120727_batch_export.csv BREAK   timesheets_we20120803_batch_export.csv BREAK   timesheets_we20120810_batch_export.csv BREAK   timesheets_we20120817_batch_export.csv BREAK   timesheets_we20120824_batch_export.csv BREAK   timesheets_we20120831_batch_export.csv BREAK   timesheets_we20120907_batch_export.csv BREAK   timesheets_we20120914_batch_export.csv BREAK   timesheets_we20120921_batch_export.csv BREAK   timesheets_we20120928_batch_export.csv BREAK   timesheets_we20121005_batch_export.csv BREAK   timesheets_we20121012_batch_export.csv BREAK

日志文件中的BREAK是文件中断的结束。

1 个答案:

答案 0 :(得分:0)

解决方案很简单,twp部分:

第一部分: 我从中读取部分文件名的文本文件,然后连接成一个全名,一些文本后面有一个空格。我打开文件,“全选”,然后手动删除尾随空格。

第二部分: 这修正了它(true)

{ if (line.back() == '\r' || line.back() == '\n') line.pop_back();} 

综合解决方案:

while (true) { if (line.back() == '\r' || line.back() == '\n' || line.back() == ' ') line.pop_back();}