Что не так с записью в этот дескриптор файла? - PullRequest
1 голос
/ 12 октября 2010
#include<stdio.h>
#include<ctype.h>

int main() {

    FILE *fpin = fopen("in.txt", "r");
    fprintf(fpin, "hello, world!");
    fclose (fpin);

    char c;
    fpin = fopen("in.txt", "r");
    FILE *fpout = fopen("out.txt", "w");
    while ((c = fgetc(fpin)) != EOF) {
        fputc (toupper(c), fpout);
    }

    fclose (fpout);
    fclose (fpin);
    return 0;
}

Я получаю

Ошибка сегментации

Спасибо.

Ответы [ 4 ]

10 голосов
/ 12 октября 2010

Я ничего не знаю о C, но похоже, что вы пишете в файл, который вы открыли только для чтения ...

FILE *fpin = fopen("in.txt", "r"); 
fprintf(fpin, "hello, world!"); 

вероятно должно быть:

FILE *fpin = fopen("in.txt", "w"); 
fprintf(fpin, "hello, world!"); 
4 голосов
/ 12 октября 2010

Сначала я вижу, что вы не проверяете успешность вызова fopen. Это может привести к сбою и привести к тому, что fpin будет иметь значение NULL, что позже приведет к проблемам в коде.

FILE *fpin = fopen("in.txt", "r"); 
if (!fpin) { 
  printf("Error opening in.txt");
  return EXIT_FAILURE;
}
3 голосов
/ 12 октября 2010
  1. Измените char c; на int c; - fgetc возвращает целое число.
  2. Проверьте возвращаемое значение вызовов на fopen, чтобы увидеть, получаете ли вы НЕДЕЙСТВИТЕЛЬНЫЙ возврат.
  3. Измените режим первого fopen на "w", чтобы вы могли записать в файл.
  4. Возможно, вы захотите добавить \n в конец "hello world!".
1 голос
/ 12 октября 2010

Скорее всего, один из ваших fopen вызовов завершится неудачно и вернет NULL. Наиболее вероятным кандидатом для этого является следующая строка:

FILE *fpin = fopen("in.txt", "r");

Вы, вероятно, намеревались использовать здесь "w", как позже попытаетесь записать в файл. Я предполагаю, что файл еще не существует ... и, следовательно, когда вы пытаетесь открыть его с помощью "r", вызов fopen завершается неудачей.

...