#c
#c
Вопрос:
Я новичок в C . Цель программы — предоставить пользователю возможность открыть файл, записать в него, затем прочитать файл, в который только что была записана запись, и отобразить обратно то, что сейчас находится в файле. Когда он примет пользовательский ввод, но после нажатия enter произойдет сбой. Я думаю, что это сбой, когда он пытается прочитать файл?
#include <stdio.h>
#define SIZE 80
#include <iostream>
int main(void)
{
FILE * pFile;
int c; // variable to hold character input by user
char sentence[SIZE]; // create char array
char filename[SIZE]; //create filename array
char filesentence[SIZE];
int i = 0; // initialize counter i
int number;
std::cout << "Give a number. 1 for file. Anything else for standard.";
std::cin >> number;
getchar();
if(number==1)
{
puts("Enter filename to append: ");
while ((i < SIZE-1) amp;amp; (c = getchar()) != 'n') {
filename[i ] = c;}
filename[i]= '';
//fgetc(sentence,80,stdin);
pFile=fopen(filename,"w ");
puts("Give a sentence to place in file:");
while ((i < SIZE-1) amp;amp; (c = getchar()) != 'n') {
sentence[i ] = c;}
sentence[i]= '';
fputs(sentence,pFile);
i=0;
do {
c = fgetc (pFile);
filesentence[i ] = c;
printf(filesentence);
} while (c != EOF);
fclose (pFile);
}
else
{
// prompt user to enter line of text
puts("Enter a line of text:");
// use getchar to read each character
while ((i < SIZE-1) amp;amp; (c = getchar()) != 'n') {
sentence[i ] = c;}
sentence[i]= '';
// terminate string
// use puts to display sentence
puts("nThe line entered was:");
puts(sentence);
}
}
Комментарии:
1. Почему вы так думаете? Разве ваш отладчик не показал, где именно произошел сбой и почему? И даже показывать сообщение об ошибке? Кроме того, такое сочетание функций C и C довольно беспорядочно. Почему бы на самом деле не написать C ?
2. Не уверен. Просто прочитав его во время работы, я могу указать имя файла, а затем текст для записи в файл … но затем после этого происходит сбой, когда он пытается прочитать файл обратно и вывести его
3. если вы собираетесь писать на c , используйте
string
вместоchar
. кроме того, я предлагаю вам использовать символьные константы вместо макросов дляSIZE
. Пример:const int size = 80
. вы также должны использоватьusing namespace std;
, чтобы вам не приходилось продолжать писатьstd::
4. Что касается рекомендации FluorescentGreen5 использовать «using namespace std;», я не советую этого делать. STD большой, и это может привести к конфликту имен. Используйте что-то вроде «using std::cout;» для всего, что вы фактически используете вне пространства имен, позволяет опустить пространство имен, давая понять, откуда оно взялось. Что касается вашей реальной проблемы, послушайте Сами Кухмонена и прочитайте учебник по отладчикам. Какую среду IDE вы используете? Если вы не знаете об отладчиках, пробовали ли вы системные сообщения по всей программе, чтобы изолировать ошибку?
5. @FluorescentGreen5 Это довольно распространенное явление. Например, в eclipse это делает стандартная программа Hello World. И это не ТАКАЯ УЖ плохая практика. Для других библиотек вы можете просто полностью включить пространство имен, особенно когда они довольно узкие и сосредоточены на чем-то, исключая возможность столкновений и позволяя легко догадаться, откуда берется материал.