2016-10-14 9 views
0

Я работаю над HEVC, то есть X265, и здесь я пытаюсь ввести массив QP со значениями, которые я читал из файла. Я знаю, что значения qp-массива будут равны 0 100.Чтение файла и ввод его как ввод его как целочисленного массива

Я создал файл тестирования и ввести комбинацию из 1 и 0 до 99. файлов выглядит следующим образом:

10101010110101010000000000000000000000000000000000000000000000000000000000000000000000000000000000 

код я написал для этой цели следующим образом:

ifstream myfile; 
    myfile.open("/Users/Ahmedrik/Mine/Uni-Stuff/Test-FYP/roi.txt"); 
    char input[100]; 
    int qp_input[100]; 


     while (!myfile.eof()) { 
      myfile >> input; 
      cout<< input<<endl; 
     }myfile.close(); 


    for(int i=0;i<100;i++){ 
     qp_input[i]=(int)input[i]; 
     if(qp_input[i]==48){ 
      qp_input[i]=1; 
     } 
     else 
      qp_input[i]=0; 

     cout<<i<<" : "<<qp_input[i]<<endl; 
    } 

Но я не могу иметь правильные значения. Qp_input остается 0. Что я делаю неправильно?

+0

[почему в то время как (! Myfile.eof)() неправильно] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a- loop-condition-thought-wrong) – BeyelerStudios

+0

Несмотря на ваш странный способ чтения из файла (релевантно: http://stackoverflow.com/questions/18398167/how-to-copy-a-txt-file-to-a-char -array-in-c), ваш код отлично работает для меня. – SingerOfTheFall

+2

У вас неправильные значения, потому что значение ASCII '1' равно 49, а не 48. Не используйте магические числа, пожалуйста. –

ответ

0

Ввод в массив, и вы пытаетесь прочитать в указатель «>> input» вместо индексов массива внутри этого массива, например. ">> input [index]". У вас должен быть счетчик в вашем цикле и читать в массиве.

int index = 0; 
    while (!myfile.eof()) { 
     myfile >> input[index]; 
     cout<< input[index] <<endl; 
     index++; 
    } 
    myfile.close(); 

Также, какой тип данных в файле. На монете вы будете читать в символах, поэтому предполагается, что они байты. Если у вас есть результаты в текстовом десятичном формате, вы захотите изменить тип ввода на int или double.

+0

вы выполняете непроверенные чтения, неудачный пример - также нет ничего плохого в чтении строки – BeyelerStudios

+0

@BeyelerStudios Но входной массив равен 100, а затем они перебирают массив в цикле for. Очевидно, что входной массив не является строкой массива символов, а предназначен для хранения 100 записей. Пример, который я привел, просто исправляет проблему индексации, которая является вопросом. –

+0

Нет, ваш код ничего не фиксирует в коде OP. Вместо этого он вводит новые ошибки, например, оставляя 100-строчную запись неопределенной для 99 символов во входном файле. Вы не проверяете свои входные данные, запись в 100-й позиции по-прежнему будет подсчитываться с помощью 'index', и она будет записываться за пределами массива, если имеется более 99 символов ввода. Никакого улучшения. – BeyelerStudios

2

Проверить это решение

#include <stdio.h> 
#include <iostream> 
#include <string.h> 
#include <sstream> 
#include <fstream> 
using namespace std; 
int main(int argc, char* argv[]) { 
    ifstream myfile; 
    myfile.open("text.txt"); 

    int qp_input[100]; 

    //will read whole contents to a string instead of while(!myfile.eof()) 
    std::string input((std::istreambuf_iterator<char>(myfile)), 
         (std::istreambuf_iterator<char>() )); 
    for(int i=0;i<input.size();i++){ 
     stringstream ss; 
     ss<<input[i]; 
     ss>>qp_input[i]; 
     cout<<i<<" : "<<qp_input[i]<<endl; 
    } 
} 
+1

Вы можете даже пропустить ненужные выделения, выполнив: 'std :: for_each (std :: istream_iterator (myfile), std :: istream_iterator (), [] (char ch) {...});' или использовать 'std :: transform', чтобы заполнить массив' qp_input' ... – BeyelerStudios

+0

@BeyelerStudios wow .... thatz awesome. Но нам нужен компилятор 11 для этого обряда ...? –

+1

Если вы хотите использовать лямбда да, иначе просто определите тип функтора (введите с помощью 'operator()') и используйте вместо этого экземпляр этого. – BeyelerStudios