2017-01-13 3 views
1

Эй, ребята, так что я пытался получить C++, чтобы напечатать текстовый файл в визуальной студии про 2013. Это мой код до сих пор:Trouble печать текстовый файл в C++

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 

    char word[30]; 

    FILE *fp; 

    if ((fp = fopen("Text.txt", "r")) == NULL) 
    { 
     printf("File could not be opened\n"); 
    } 
    else 
    { 
     fscanf(fp, "%s", word); 

     while (!feof(fp)) 
     { 
      fscanf(fp, "%s", word); 
     } 

     fclose(fp); 
    } 
    system("PAUSE"); 
    return 0; 
} 

text.txt был текстовый файл, который я сделал в visual studio, и хранится в исходных файлах. В настоящее время все, что происходит, это окно печатает сообщение о паузе ... любые предложения по его исправлению? Извините за вопрос noob: p

+0

Проверить возвращаемое значение 'fscanf()' – chux

+0

Попробуйте поместить 'printf ("% s ", word);' before 'fscanf (fp,"% s ", word);' in while-loop. или используйте 'fgets' и' fputs'. Например: 'while (fgets (word, sizeof word, fp)) fputs (word, stdout);' – BLUEPIXY

+0

@BLUEPIXY, который сработал! Большое спасибо за вашу помощь :) – moop

ответ

2

Вы не используете никакую другую функцию, которая бы печатала что-либо на экране.

scanf() - это функция, которая читает и в определенной степени интерпретирует стандартный ввод (обычно пользовательский ввод).

Эквивалентная функция печати printf().

Функции scanf() и printf() управляются посредством строки форматирования, которая сообщает им, как интерпретировать выводимые данные, или как интерпретировать стандартный ввод, который должен храниться в переменных.

Форматирование строки предоставляется в виде гр строки, которая является нулем строка, которая представляет собой массив символов с последней, являющейся NUL (\0 лицо; '\0' символ). В этой строке вы можете предоставить информацию о типе и порядке чтения или записи данных. Fe. %s обозначает строку. Собственная строка может содержать байты всех значений, кроме NUL, который считается завершающим символом. Но что касается ввода, пробел считается концом строки, поэтому scanf() перестанет читать, встречая пробел.

Когда вы читаете данные, вам необходимо предоставить функцию с адресом, и она сохранит там значение. В случае строки, как строки работают в C, вы передаете значение из указателя на символ. Указатель на символ сохраняет значение, являющееся адресом в памяти. Этот адрес может быть одного символа, но он также может быть адресом первого символа в массиве, где последовательные символы хранятся в следующих ячейках памяти. Однако информация о том, сколько памяти, начиная с адреса, хранящегося в этом указателе, выделяется для хранения этого массива символов, не сохраняется автоматически. Фактически, это может быть действительно один символ, который, таким образом, способен хранить не более 0 значащих символов + нулевой завершающий символ, если вы намереваетесь использовать его как строку.

В вашем случае, word[] является массивом и word оценивает по позициям word[0] в памяти. Весь массив содержит 30 символов, поэтому вы можете хранить не более 29 значащих символов + null. Однако scanf() не гарантирует, что он остановится на 29-м символе, как вы его используете. Возможно, вам следует проконсультироваться на какой-либо справочной странице для scanf() и узнать больше о форматировании строки, я смутно помню, что, возможно, вы могли бы как-то ограничить чтение с помощью правильной строки форматирования. Может быть, что-то вроде %29s.

Так что еще раз то, что происходит, ваш обеспечить word к scanf(), так что вы предоставить адрес первого символа в массиве word[] и scanf() магазинов входа там и в следующих ячейках, возможно переполнение буфера вашего. (Прочитайте о переполнении буфера, пока мы на нем, это важная проблема)

Когда вы печатаете информацию, вам не нужны адреса для хранения, но значения для перевода в человекообразную форму.Однако бывает так, что в случае строк вы по-прежнему указываете адрес первого символа, поэтому он будет выглядеть почти так же.

+1

Обратите внимание, что '' '' является «правильной строкой», т. Е. Пустой строкой, и она эквивалентна символу '(char) {'\ 0'}'. –