diff --git a/main.go b/main.go
index 97df77a..2b3bb93 100644
--- a/main.go
+++ b/main.go
@@ -51,6 +51,13 @@ func main() {
 		DoDiff:    doDiff,
 	}
 
+	if len(paths) == 0 {
+		if err := gci.ProcessFile("<standard input>", os.Stdin, os.Stdout, flagSet); err != nil {
+			report(err)
+		}
+		os.Exit(exitCode)
+	}
+
 	for _, path := range paths {
 		switch dir, err := os.Stat(path); {
 		case err != nil:
@@ -58,7 +65,7 @@ func main() {
 		case dir.IsDir():
 			report(gci.WalkDir(path, flagSet))
 		default:
-			if err := gci.ProcessFile(path, os.Stdout, flagSet); err != nil {
+			if err := gci.ProcessFile(path, nil, os.Stdout, flagSet); err != nil {
 				report(err)
 			}
 		}
diff --git a/pkg/gci/gci.go b/pkg/gci/gci.go
index 7efa576..67ba91e 100644
--- a/pkg/gci/gci.go
+++ b/pkg/gci/gci.go
@@ -258,7 +258,7 @@ func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
 func visitFile(set *FlagSet) filepath.WalkFunc {
 	return func(path string, f os.FileInfo, err error) error {
 		if err == nil && isGoFile(f) {
-			err = processFile(path, os.Stdout, set)
+			err = processFile(path, nil, os.Stdout, set)
 		}
 		return err
 	}
@@ -274,20 +274,23 @@ func isGoFile(f os.FileInfo) bool {
 	return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
 }
 
-func ProcessFile(filename string, out io.Writer, set *FlagSet) error {
-	return processFile(filename, out, set)
+func ProcessFile(filename string, in io.Reader, out io.Writer, set *FlagSet) error {
+	return processFile(filename, in, out, set)
 }
 
-func processFile(filename string, out io.Writer, set *FlagSet) error {
+func processFile(filename string, in io.Reader, out io.Writer, set *FlagSet) error {
 	var err error
 
-	f, err := os.Open(filename)
-	if err != nil {
-		return err
+	if in == nil {
+		f, err := os.Open(filename)
+		if err != nil {
+			return err
+		}
+		defer f.Close()
+		in = f
 	}
-	defer f.Close()
 
-	src, err := ioutil.ReadAll(f)
+	src, err := ioutil.ReadAll(in)
 	if err != nil {
 		return err
 	}