2014-11-29 2 views
-4

Привет, ребята У меня есть проблема с печатью содержимого строки в Visual C++ 2013 код прост, как вы видите:«соиЬ» не работает со строкой

#include <iostream> 
#include <string> 
#include <fstream> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 
int main() 
{ 
    ifstream file("d:\\t.txt"); 
    if (file.is_open()) 
    { 
     string a[5]; 
     for (int i = 0; i < 5; ++i) 
     { 
     file >> a[i]; 
     } 
    } 
    cout<< a; 
    system("pause"); 
} 

Я получаю следующее сообщение об ошибке:

1>------ Rebuild All started: Project: Project3, Configuration: Debug Win32 ------ 
1> Source.cpp 
1>c:\users\malatrab\documents\visual studio 2013\projects\project3\source.cpp(14): error C2065: 'a' : undeclared identifier 
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== 

Поэтому, пожалуйста, любые идеи по этой проблеме. Компилятор не может распознать строковую переменную a.

+3

'a' не является' string': вы использовали цикл для его записи, используйте цикл для его чтения. – quantdev

ответ

2

ничего не названо a в том объеме, в котором вы его используете.

также обратите внимание, что cout напрямую не поддерживает вывод массивов (кроме массивов char). передавая такой массив непосредственно непосредственно на операцию вывода cout, он распадается на указатель на первый элемент. поэтому вам нужно сделать несколько циклов для вывода этих строк, когда вы устранили основную проблему.

1

a не является std::string, это массив std::string. Однако компилятор действительно жалуется на объем. Вы объявили его в блоке if { }, но попробуйте использовать его во внешнем блоке. Во-вторых, вам не нужно иметь дело с массивами здесь, особенно если вы собираетесь читать из файла. Вместо этого используйте std::vector, накладных расходов практически нет.

std::vector<std::string> a; 
if (file.is_open()) 
{ 
    std::string word; 
    while (file >> word) 
    a.push_back(word); 
} 
1

массив имеет блок области действия оператора, если

if (file.is_open()) 
    { 
     string a[5]; 
     for (int i = 0; i < 5; ++i) 
     { 
     file >> a[i]; 
     } 
    } 

Затем управление передается за пределы составного оператора из если массив будет разрушен, и идентификатором не будет виден.

Также есть еще одна проблема. Я думаю, вы хотите вывести каждый элемент массива в этом утверждении

cout<< a; 

вместо адреса первого элемента массива.

Rewrite основной следующим образом

int main() 
{ 
    const size_t N = 5; 
    string a[N]; 

    ifstream file("d:\\t.txt"); 

    if (file.is_open()) 
    { 
     for (size_t i = 0; i < N; ++i) 
     { 
      file >> a[i]; 
     } 
    } 

    for (size_t i = 0; i < N; ++i) 
    { 
     cout << a[i] << endl; 
    } 

    system("pause"); 
} 

Вы можете использовать оператор, основанный диапазон для вывода массива

for (const auto &s : a) cout << s << endl; 

Также вы должны написать заголовки C, как

#include <cstdio> 
#include <cstdlib> 

Как не декларации из заголовка <cstdio> используется в программе, тогда вы можете удалить соответствующий #inclu директива.

+0

Спасибо всем за помощь. – mustafa

2

Чтобы поместить a в область действия, инициализируйте его перед оператором if. Кроме того, a - это массив, и вы должны указать позицию, к которой хотите получить доступ. В этом случае цикл задает значения от 0 до 4, по одному за раз.

ifstream file("d:\\t.txt"); 
string a[5]; 
if (file.is_open()) 
    { 
     for (int i = 0; i < 5; ++i) 
      { 
      file >> a[i]; 
      } 
    } 
for (int i = 0; i < 5; ++i) 
{ 
    cout << a[i]; 
} 
system("pause"); 
Смежные вопросы