2013-05-20 2 views
0

Я пытаюсь прочитать из текстового файла и написать его, но каждый раз, когда я выполняю свой код, ничего не происходит с текстовыми файлами. «Ничего не происходит», я имею в виду, что программа не будет читать мой входной файл, и никакие данные не будут экспортированы в мой выходной файл. Может ли кто-нибудь указать, почему он не работает? Спасибо за любую помощь, предоставленную заранее. Вот мой код:C Программирование файлов ввода/вывода

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

FILE *inptr, *outptr; 

int main() { 
    int a, b, c; 
    inptr = fopen("trianglein.txt","r"); //Initialization of pointer and opening of file trianglein.txt 
    outptr = fopen("triangleout.txt","w"); //Initialization of pointer and opening of file triangleout.txt 

    while((fscanf(inptr,"%d %d %d",&a, &b, &c))!= EOF){ 
     fprintf(outptr,"\n%2d %2d %2d\n",a,b,c); 
     if(a+b>c && b+c>a && c+a>b){ 
      fprintf(outptr, "This is a triangle.\n"); 
      if(a !=b && b !=c && a!=c){ 
       fprintf(outptr, "This is a scalene triangle.\n"); 
       if(a==b && a==c && c==b){ 
        fprintf(outptr, "This is an equilateral triangle.\n"); 
        if(a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b){ 
         fprintf(outptr, "This is a right trianlge.\n"); 
        } 
       } 
      } 
     } 
    } 

    return 0; 
} 

trianglein.txt содержание:

10 12 15 
2 3 7 
3 4 5 
6 9 5 
6 6 6 
6 8 10 
7 7 9 
+4

Кажется, что работает для меня. Как и в том случае, когда я запускаю его, triangleout.txt содержит материал. Можете ли вы разместить содержимое своего trianglein.txt. (Также вы можете захотеть переустановить свою логику, потому что правый треугольник не является равносторонним треугольником.) – FDinoff

+0

Кстати, вы можете захотеть реструктурировать свой код, используя «продолжить» - это позволит вам избежать этого огромного количества отступов – thejh

+1

Если ничего не происходит то в рабочем каталоге нет файла «trianglein.txt». Проверьте возвращение fopen. Поместите файл в рабочий каталог, если это случай. Также проверьте содержимое «trianglein.txt». Использование отладчика - хорошая идея. – kotlomoy

ответ

-2

EDIT: Как было предложено icktoofay, этот ответ неверен.

Для получения данных, записанных в файл, вы должны сделать fclose() или fflush(). Вставьте эти кода прямо перед return 0;

fclose(inptr); 
fclose(outptr); 
+1

№ В соответствии с проектом C99 N1256 §7.20.4.3 ¶4 все потоки сбрасываются при завершении программы. – icktoofay

+0

Добавление этих двух блоков кода все равно ничего не меняет. ??? – Cranderberry

+0

@icktoofay Ну ладно, ты прав. Я только что скомпилировал код. Оно работает. Я все равно не удалю этот ответ. –

-1

Попробуйте положить

fclose(inptr); 

и

fclose(outptr); 

в конце кода.

+1

-1, это не поможет. – thejh

+1

Извините, но почему бы и нет? – mecid

+0

+1. Я считаю, что это помогает. @thejh вы можете объяснить свою идею? –

3

Несколько проблем.

Во-первых, вам нужно проверить, действительны ли inptr и outptr, протестировав NULL.

Во-вторых, fscanf может возвращать либо EOF, 0 или> 0.

Если входной файл не содержит правильный вход.

Также есть проблемы, связанные с тем, что вы можете получить 3 ints read successfull или 2 ints или 1, а значение a, b и c задано только опционально.

Если преобразование не было выполнено на входе, возвращается значение нуля, и в этом случае цикл while будет завершен.

иметь также в виду, что с функциями зсапЕ стиля этот вход будет успешным и возвращает значение 1.

"1rubbish"

Я думаю, что вы можете что-то вроде следующего:

// Somewhere near the top 
#include <stderr.h> 
// ... other includes 

const char* inname = "trianglein.txt"; 
const char* outname = "triangleout.txt"; 

// Any other stuff 


// Inside main... 

// Initialization of pointer and opening of file trianglein.txt 
if ((inptr = fopen(inname,"r")) == 0){ 
    fprintf(stderr, "Error opening file %s: %s", inname, strerror(inname)); 
    return -1; 
} 

// Initialization of pointer and opening of file triangleout.txt 
if ((outptr = fopen(outname,"w")) == 0){ 
    fprintf(stderr, "Error opening file %s: %s", outname, strerror(outname)); 
    return -1; 
} 


int result; 
while(true){ 
    result = fscanf(inptr,"%d %d %d",&a, &b, &c); 
    if (result == EOF) 
    break; 

    if (result < 3) // Ignore incomplete lines 
    continue; 

    // do the normal stuff 
} 
+0

Хотя «тестирование против NULL» семантически корректно, и ваш код правильно использует 'if (! Inptr)', эти два не соответствуют друг другу. «If (input! = NULL)» явно будет соответствовать, но вряд ли кто-нибудь будет беспокоиться. Идиома имеет тенденцию быть 'if (inptr = fopen (" trianglein.txt ") ...', используя присвоение в тесте. –

+0

Верно, и я бы, вероятно, написал его так обычно. – Matt

0

Ваша программа отлично работает в моей системе. Я использую Code::Blocks 10.05 на Windows 7.

Единственная возможность логической ошибки возникает, если у вас есть файл trianglein.txt с менее чем 3 целыми значениями, которые должны быть прочитаны fscanf(). Например, trianglein.txt файл со значениями 1, 1 2, 1 2 3 4, 1 2 3 4 5 и т. Д. Выдаст неверные значения переменным b и/или c. Поэтому инициализируйте a=-1, b=-1, c=-1 перед выполнением каждой итерации цикла и проверьте их после прочтения.

Если вы используете программу, проверьте файл triangleout.txt на наличие прав доступа. Иногда у вас может не быть доступа к записи в этом конкретном файле.

Кстати, логика классификации неверна. Односторонний треугольник не может быть прямоугольным.

Смежные вопросы